diff --git a/404.html b/404.html index fb88ff89..db81cfbe 100644 --- a/404.html +++ b/404.html @@ -19,11 +19,11 @@ - +
- + diff --git a/assets/js/11.23ceae43.js b/assets/js/11.23ceae43.js new file mode 100644 index 00000000..425923c5 --- /dev/null +++ b/assets/js/11.23ceae43.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{616:function(t,a,e){t.exports=e.p+"assets/img/20210307141420.f336dbea.png"},617:function(t,a,e){t.exports=e.p+"assets/img/20201013101602937.59898be4.png"},618:function(t,a,e){t.exports=e.p+"assets/img/20230520165221467.c6ffb7e4.png"},619:function(t,a,e){t.exports=e.p+"assets/img/20210410215351.ecab41f9.png"},620:function(t,a,e){t.exports=e.p+"assets/img/20201013101713701.7922a7e0.png"},621:function(t,a,e){t.exports=e.p+"assets/img/20210307153547.5edb6af9.png"},724:function(t,a,e){"use strict";e.r(a);var r=e(7),s=Object(r.a)({},(function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"java执行流程"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#java执行流程"}},[t._v("#")]),t._v(" Java执行流程")]),t._v(" "),r("table",[r("thead",[r("tr",[r("th",[r("img",{attrs:{src:e(616)}})]),t._v(" "),r("th",[r("img",{attrs:{src:e(617)}})])])]),t._v(" "),r("tbody")]),t._v(" "),r("h3",{attrs:{id:"编译期"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#编译期"}},[t._v("#")]),t._v(" 编译期")]),t._v(" "),r("p",[t._v("创建完源文件之后,程序先要被 JVM中 的 Java 编译器进行编译为 .class 文件。Java 编译一个类时,如果这个类所依赖的类还没有被编译,编译器会自动的先编译这个所依赖的类,然后引用。如果 Java 编译器在指定的目录下找不到该类所依赖的类的 .class 文件或者 .java 源文件,就会报 “Cant found sysbol” 的异常错误。")]),t._v(" "),r("p",[t._v("编译后的字节码文件格式主要分为两部分:常量池和方法字节码。常量池记录的是代码出现过的(常量、类名、成员变量等)以及符号引用(类引用、方法引用,成员变量引用等);方法字节码中放的是各个方法的字节码。")]),t._v(" "),r("h3",{attrs:{id:"运行期"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#运行期"}},[t._v("#")]),t._v(" 运行期")]),t._v(" "),r("p",[t._v("Java 类运行的过程大概分为:类的加载和类的执行。需要说明的一点的是:JVM 并不是在运行时就会把所有使用到的类都加载到内存中,JVM主要在程序第一次运行时主动使用类的时候,才会立即去加载。")]),t._v(" "),r("p",[t._v("在 Java 中,JVM可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java程序无须重新编译便可在多种不同操作系统的计算机上运行。")]),t._v(" "),r("h2",{attrs:{id:"jvm内存模型"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#jvm内存模型"}},[t._v("#")]),t._v(" JVM内存模型")]),t._v(" "),r("p",[r("img",{attrs:{src:e(618),alt:"20230520165221467"}})]),t._v(" "),r("table",[r("thead",[r("tr",[r("th",[r("img",{attrs:{src:e(619)}})]),t._v(" "),r("th",[r("img",{attrs:{src:e(620)}})]),t._v(" "),r("th",[r("img",{attrs:{src:e(621)}})])])]),t._v(" "),r("tbody")]),t._v(" "),r("h3",{attrs:{id:"运行时常量池"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#运行时常量池"}},[t._v("#")]),t._v(" 运行时常量池")]),t._v(" "),r("p",[t._v("线程共享。")]),t._v(" "),r("p",[t._v('存放常量、"字符串"字面值等。')]),t._v(" "),r("h3",{attrs:{id:"方法区-method-area"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#方法区-method-area"}},[t._v("#")]),t._v(" 方法区(Method Area)")]),t._v(" "),r("p",[t._v("线程共享。")]),t._v(" "),r("p",[t._v("用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。")]),t._v(" "),r("h3",{attrs:{id:"堆-heap"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#堆-heap"}},[t._v("#")]),t._v(" 堆(Heap)")]),t._v(" "),r("p",[t._v("线程共享。")]),t._v(" "),r("p",[t._v("所有的对象实例以及数组都要在堆上分配。")]),t._v(" "),r("h3",{attrs:{id:"虚拟机栈-vm-stack"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#虚拟机栈-vm-stack"}},[t._v("#")]),t._v(" 虚拟机栈(VM Stack)")]),t._v(" "),r("p",[t._v("线程私有。")]),t._v(" "),r("p",[t._v("为虚拟机执行Java方法服务。\n每个方法在执行的时候都会创建一个栈帧,栈帧包含:局部变量表、操作数栈、动态链接和返回地址。\n每个方法从调用到执行完毕,对应一个栈帧在虚拟机栈的入栈和出栈。\n局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte 、 short 、 int 、 long 、 float 、double、char)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。\n如果线程请求的栈深度大于虚拟机所允许的深度,则会报StackOverflowError。\n如果虚拟机栈可以动态扩展,扩展到无法申请足够的内存,则会报OutOfMemoryError。")]),t._v(" "),r("h3",{attrs:{id:"程序计数器-pc寄存器、program-counter-register"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#程序计数器-pc寄存器、program-counter-register"}},[t._v("#")]),t._v(" 程序计数器(PC寄存器、Program Counter Register)")]),t._v(" "),r("p",[t._v("线程私有,一小块内存区域,唯一一个不会报内存溢出的区域。\n如果线程正在执行Java方法,则程序计数器的值为当前正在执行的指令地址。\n如果线程正在执行Native方法,则程序计数器的值为undefined。")]),t._v(" "),r("p",[t._v("The Java Virtual Machine can support many threads of execution at once (JLS §17). Each Java Virtual Machine thread has its own pc (program counter) register. At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method (§2.6) for that thread. If that method is not native, the pc register contains the address of the Java Virtual Machine instruction currently being executed. If the method currently being executed by the thread is native, the value of the Java Virtual Machine's pc register is undefined. The Java Virtual Machine's pc register is wide enough to hold a returnAddress or a native pointer on the specific platform.")]),t._v(" "),r("h3",{attrs:{id:"本地方法栈-native-method-stack"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#本地方法栈-native-method-stack"}},[t._v("#")]),t._v(" 本地方法栈(Native Method Stack)")]),t._v(" "),r("p",[t._v("线程私有,和虚拟机栈类似。\n为虚拟机执行Native方法服务。")])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/12.8a0635a6.js b/assets/js/12.8a0635a6.js new file mode 100644 index 00000000..326d145f --- /dev/null +++ b/assets/js/12.8a0635a6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{642:function(s,t,a){s.exports=a.p+"assets/img/20210321105806.5c8a9d51.png"},643:function(s,t){s.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkwAAAH+CAMAAABZUKESAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABy1BMVEX//////Pn95dH827/7yqL6t4D5sXX7wZL7zaj+9e783sX6voz4oFf3lkb4nVL6uob++PP+8uj4o137yJ371LP6tHr5qmn3mUz+7uL84cv817n96Nb4p2P5rW/7xJf70a7969z//7ZmOma22///tpBmkLbb/////9u2kJDbkGZmtv//tmYAOpDb2/8AZrb/25A6AGa2//9mADqQ2///27a2tra2tpBmOgCQZgAAAGbbtrZmZpC2kDo6Oma2ZgDbttuQOgAAAAA6AAA6kNvbkDq2kGaQOjoAADpmAAA6OpAAOma2ZjqQkLY6ZrZmtrZmttu2ttuQkJD/29uQZjq2tmZmOjpmkNs6Zmbb25A6ADrbtmbb29uQttvb27Y6ZpDbtpA6OjqQZma2/9tmZmaQtv+g0+FLrMaPzNyQOmakvt3S3+54n8xKfrtLocNLjb/09/tVhr9KlcFLqcaDp9GQkDrb/7ZmAGaQ27YAZmYAOjq7zuVhjsTo7/aOr9VzvtNit81LpsQ6kLa2ZpDb/9sAZpCQkGaQtrZmZraQZpCQ29u2tv9mkJBmZjq225BmOpC2Zma229uQtpA6OgDbkJCQ25CQkNu227ZmkGa2kLaQcXUVAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOwwAADsMBx2+oZAAAI+dJREFUeNrtnf1/00aex4dgAiQoQCiEQnhwA1ZjBRs3MdnwoEaxIIGQpSWku5C0gdK95SG7tPvQ3dJ2d7u90t3bvW2ve3t3f+69ZkaSZVu25FiyvqN83j9AbNmj72fm45nRSPqKMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgLLsGhjYncvtGWxkb27fwMD+tGMDirBrYCg3PHhA68jI4MHc7oFDaccK6HJ4KDc44vpldHDwCO+GGnktlzs6eMz9zNjgkd3H044akON110djgwdzJ0I7nYGh3F6n+xobPDK0K+3wARVO7jsqbHHgaO71ruZDuwb2HRwXXz2VG0hbBUifoWHRI42f7s5HdXYN5E6JHurgbnRQO5mBvXyoOjB8oscDtF1Dp8fhp53M4SOjfKJ9OqYp9OEzfGI+NnwybV2g77x+VDjpbJxlHs7x/unUCXRPO4lD+0YT6kSO7x3RtJEjh9NWCPrEodyIpo3uS2ghe9cJPtwNw047AWGlwaEkd3FyGHbaEezjVkp8Uegwt9NenMTLNAPj/bASc+w08lraekFi7B/WtPG+LVUfH9S0U7EeLQI6nBjRRvb1c4e7D2jaEawTZJBDBzXtYJ9nMYeOaNopTMQzx8lRbeT1FHY7ro3sTls7iJczY9pgKgdXh4Y1bS+GuiyxV9Nyae37xJh2FG7KDLsOpjLEuRwf1Y7hEt+McOioNpLqIfrhY9oxTMMzwa5j2mjKV2ofOqaNYjk8CxzVRlPvFnYd1Y5h3qQ+p7WR1L0k+qajaccAeuWMNkbi2sfDB7S9accAeuOkpiV6tUl0zo5pWL1Uml3HtCNpx+ByQjuASbjK5LRxOvPeo9rBtEMA2+fsmEZiwiTZP4KBTmH2aKfTDsHPCe0AnX4SdMdZbYzWLOUYuiZlIdYxMTakHUs7BLA94u6Y8m9MeH+fO19gjOlvTnRXxCiVhQrQJbm4lgkni+I/Y4ob6IL8uyT+K1+sdFXSGW1P2rUCtsWpuLqB/FvTM9Xqpdnz1Wr1R3OiM+JmulytXrpSrV69Ft1Qh7URTMFV5JA2FtdVRGbR65gcRM90eYIx/e2uShrVkMhJRYa0wagf1ectCbdIecGyrBpjtvuGg1n0Pn65enXq+tyEfmOalS92NW06nd4Vn6AHct21m7E4Lf43rSJ3V43ZUwWWX/K6o/LNgnHLM46cM9klZk93FdQQLh5QkmHtRDcfd8xkWG4HxM3E7MVpvVpdvllgZk046ILz6RKfMr15+9KV6qXZleh7Oa6dSrtewDbY0930RJpJn/e6ImEm+a5RY/bij6tXp6pXnf5L9kz6jTtdBrVfG027XsA2OKV1dbGutE1+yZsluT2TNJP+jrceID59690LTXPyaGhjadcL2AajWldXWLpmqrlvcDOVF4R/DPmmMNPdAmMzqwulmWq1Or9S5asF3VhqVEu7XsA2OLY9M9V7Jkse1QkzcevwYa56b6HE8mvvCV+Vbxb4GlRXUY3BTCoyGMecydnm65lY/c/laXFA1w27tANp1wvYBsPdLYA7R3N249GcZDLQTOW1n9z+6f3uOqbDONWrJEe0rnJtOWbS54WbzFrdTPpy7YE4r9vcMzH9+sKt7k71vh59JRUQosuTqu6ipTdXcs2kz4te6Ep1/fLG+vr6+9ULdTMt31pd+KAbO8V28hn0lcPaSDwF6cJUm6sP+XkWi5/onXljlptpc+18gc3ML3Yx0g3iGhQ1GU3uAnD90Yebjx5vyK5r+aPI3zs0piGFhZIM0zupOoSzKYryOr3r9/doZ9IOAWyPY92d6k2es9oYNXuDiJC7fp/cHQ4gOsSu3yd36xXogte0A5QOnk6hY1KZQUprhGdoWRt0yfExOhfwHx7TUszSCnpnH5lkkrsGteG0YwC9cYpKMsk92igGOcU5NE7jfpC9JFJrgt44PEpheMkRSa0JeuPsiDac9kiXI5NaE/TG2ZG0H16yVxsjdmIHbJeUH16S8qNbQLwcPqaNpjZl2X8q5Ue3gHg5dErT+vpE1TpDI9o4juOyRU7TjqawfLnrtJb+9B/EzcAB7UDf05OeHMfUO5PsH9S0wb4+K+zQXk0bT/npZCAhToxoY318NPzuA9rYPgxxWYU/fXm0T8POwKCmHUW3lGVOjvfHTkPHNO0AZktZ58Qot1Oyo89ubqUzGOF2ALypR44ktvazf98BWGkHMXRK07SjiZziODs8pmmjr8FKO4iTw5qmjZ6O+TTH4TPHNE3bgxNxO439uQPx+kk6aeQ0zp3sSIaGR7if9g71Pii9fpo7aezgboxvOxfpJ+1UroeLCs7uO6rBSYAzkOPTcU0bPH2i6yHv+O4jg2P8y+OnY+jeQBbYNXR6XJOO2psbiGSp4wP7TksfaaPDJ4jcTgWoMHBm+Jh0lDY+mMvldg8MtJ4NOTkwsC+XG3Q/OLonN4AbmEAwAydyR09pERgfPHIGPgLh7B/YncvtHRwcb7bQgcHBg7ncawM4gQsAAAAAAAAAAACwg/jZv1Hk52lXy86t+l7qPu3Q25B2Q/eDtOs4/ron2W4kg9ohKmEmJaGpEmZSEpoqYSYloakSZlISmiphpq7wPfG8663qqEwjKpKK6JhJn0/OWySrHmbqDpgpqahIKkomKMN5gnmwmTpvVUdlmlGRVAQzpQfMFIQ+b1mWNVdhhmVZUwVm8pc1zy7lBcsqchMFbjVrtvguM/m2ki0+Uy+SjsrYgZkC0OdLjJlzFWbPVeTUp6HvyS/VmP6k3VZmWiX5tjCTVZKfd4ukozJ+YKYA8ktFMXaJ/4VVWszkfqp1q/CQeEv2TPIdt0hCKuMHZgrA7Ub4cGZZVotdbP4Wa7dV+Ke8UGwwE3omFRXFYyY5veGOkDRPsU2LWy14axszxThjIlr1MFMQ5fvSHM54FnS8Vl4ottsaOMy5RRJSGT8wUwD5JUsep9ncJcZUweujhF2MkjRL8FZnzl1iTXMmp0g6KuMHZgpAny86C9i26wBTLga4dnFeBW91VwMah7linGviJKseZgrCFpMbO2CKE+V0ivBP9CJTUxk/MFMANu9nxEjVsmXbZmpbZGoq4wdmCsJ217RbNmzXTO2LTE9l7MBMSkJTJcykJDRVwkxq8fQZYZUwk1o833r+jKxKmEktnm9tcTvRVJlJMz3dyjjPf0Gx6mEmRfnli7Qruk3dp/HdRAVl3kwff/KrtOu5Xd2n8V2SghSAz5k+fvqCpkqYSS2ecytRVQkzqcWvn76gqxJmUhKaKmEmJaGpEmZSEpoqYSYloakSZlISmiphJiWhqRJmUhKaKsmaSdzR4btINr9U1OcjXPZKs5rjhqbKhM1kyLtY6/crBlO/Odaj2Uz8+mojws0dNKs5bmiqTNhMtmWVtm0m/0vRK8lUEckJUgeaKpM209xv+G2vvZtJ3l5tht8qRLOa44amysTN9CEfq6SZnNxY4k5EQ+YRcTwk/zB8N8iWTCfBkZNYK/JNjDSrOW5oqkzcTBXDKkozubmxhHPMhzVWnwOJt7zcWSLNliXN5CbWkh1VhARHNKs5bmiqTN5M3BvcEl5uLJ6qSH9yz70Rnzlm8rbLbsysm8nNmBQ4HMYpSB1oquyDmcoLNW6Jem4se6pQvvnbTyv1+TQ3ibddOsYd5mRiLZhJBZV9MBOzF38nzORZ5/60XdPni/UjfWmmhgmUayaZWMtZJYCZSKvsh5nyS78Xw5x7RKfP18wis0u2d2wmhzlne8Mwx3xZ2DBnIq6yH2bih2l8Au7mxmL2ZxcrzLg163UzwiTedj4BN50JuJdYC0dz9FX2xUzMbMyNVV4QywWOM3hSNdEpudt5/sea7eU+FksDsk8yw5Nl0azmuKGpkuy5uSbE2Be29tnvoNKDpkpVzIRzcwqoVMZMuGqAvkplzKR0UDtEJcykJDRVwkxKQlMlzKQkNFVm2kwvX6YdTT9U0iHDZnr5+dbTtKNJXiUlMmuml59vbcFM6kRFUpEMSlgp0zxLu6Lb1n3/v5uooC8ybyWYqX+Cvvgy7baGmfr43aQFSTthzqRMVCQVeUFxO8FMykRFUpEvqC++hJmUiYqkIpJB7RCVMJOS0FQJMykJTZUwU+xEuFA9AyrjjoqkooSDsp0bSTsAM2VGUdJmEneVWp3uBeVminCDH2WVKURFUlE/zNT5KeAwU2YU9cdMvgxBTtIfmQ3BuQ/ZjPVR4f1XmUJUJBX1w0ymuAHZyQDkJP1pMBN6pmwo6scEXGZWbMgAxGAmmKlbbJGIrMj8GYJ8SX9gpkwp6sswJ9Ij1o/oZNIfmAlm6g6ZkNMqNuY9EEl/YCaYqTuEmUTqMTcDkJf0Z3HaSwQUJSsZZZUpREVSUT/MJI3kZgBykv40JALibyZpJ5JVDzOpCU2VMJOS0FQJMykJTZUwk5LQVAkzKQlNlTCTktBUCTMpCU2VMJOS0FTZm5lIknaV9gOaKnuJ6g9p2yaQP6Zdpf0ge2YCqUGz2WhGBUKg2Ww0owIh0Gw2mlGBEGg2G82oQAg0m41mVCAEms1GMyoQAs1moxkVCIFms9GMCoRAs9loRgVCoNlsNKMCIdBsNppRgRBoNhvNqEAINJuNZlQgBJrNRjMqEALNZqMZFQiBZrPRjAqEQLPZaEYFQqDZbDSjAiHQbDaaUYEQaDYbzahACDSbjWZUIASazUYzKhACzWajGRUIgWaz0YwKhECz2WhGBUKg2Ww0owIh0Gw2mlGBEGg2G82oQAg0m41mVCAEms1GMyoQAs1moxkVCIFms/UW1c/SzuwVzM/TrtXEyaKZ0nZNO9Ku1cShKbFXM6UdvzpR7QCJMJOS0JQIMykJTYkwk5LQlAgzKQlNiTCTktCUCDN1BX9s6na3KiIxtaiyqKkj3ZhJPBZaPYmpRZVFTR2BmZKLKouaAuHPmmdtzdR5qyISU48qi5oCgZmSjyqLmpgYoSzLsuYqzLAsa6rATP6y5tmlvGBZRW6iwK1mzRbfZSbfVrLFZ+pFEpGYBDBTAPp8iTFzrsLsuYqc+jT0PfmlGtOftNvKTKsk3xZmskry826RRCQmAswUQH6pKMYu8b+wSouZ3E+1bhUeEm/Jnkm+4xZJRWIiwEwBuN0IH84sy2qxi83fYu22Cv+UF4oNZkLPtCM1uVOmuYpwhKR5im1a3GrBW9uYKcYZUzYrPouauBPuS3M441nQ8Vp5odhua+Aw5xZJRWIiwEwB5JcseZxmc5cYUwWvjxJ2MUrSLMFbnTl3iTXNmZwiiUhMBJgpAH2+6Cxg264DTLkY4NrFeRW81V0NaBzminGuiWex4rOoiZtCTG7sgClOlNMpwj/Ri0xHYiLATAHYvJ8RI1XLlm2bqW2R6UhMBJgpCNtd027ZsF0ztS8yJYlJADMpCU2JMJOS0JQIM6nF02eEJcJMavF86/kzshJhJrV4vrXF7URTYibN9MlWxnn+C5oVDzMpyS9fpF3LQRUPMynIx5/8Ku1KDqz4LJqJZFTxwOdMHz99QVMizKQWz7mVqEqEmdTi109f0JUIMykJTYkwk5LQlAgzKQlNiTCTksQvUVwN2uOFoDCTkmxfou3cntUMzKRSVEQkiiuHxXWfjZgxXJ5O2EzNv5X8UlGfj3KtIszUAWGmgOuHlTCTIW89rN9kFkz9jka/vAYz8YtijShX5MNMHXDMVKvn3RA315RMJzmCm5Sjv1FF/LZtWaVtm8n/UvRK8v7+RDUpQY9mMvmkycu7IVJ0WNJMblKOPkcV8dv23G945L2bSd4Ta0a4vwNm6oCYgJf8eTdk05h1M6UQVcRv23Mfcvc3dKzi12HI5A+Oh+QfnTre6HeewUwdsEU3VPTl3ZBV79a2bW0/VUsfzFQxrKI0k9uxivDNhzVWnwOJtzp2vLKjipKVBmbqgO2mIWv6Hbtmkkk5+h1VxG/z4M25CreE17Hy/DL6k3vu3dOuoo4dr8hJEzgcxqxJCXo0k/fzZt50tm6mSHUcc1QRv22L1DQ1HnE9oZE9VSjf/O2nlfp8mgvo2PHCTPFIFGaSeRTcvBt8HDCdccBNytHnqCJ+Wy6SLf5OmMmzzv1pu6bPF+tH+tJMHTpeZ5UAZupRojP1FIdzVj3dZs328iZSXhqQ6xq/F8Oce6Sgz9fMIrNLtndsJoe5Th0v5kzkJfbHTPwwrcbqHSuzP7tYYcatWe83IEzSsePF0Rx5iX0yEzMbExqVF8RygeMMnglLdEqdOl7ZJ0VZ9adZ07FCUyLhc3NNiLEv0poazZqOFZoS1TETzs2Rl6iQmXDVAHWJCplJ8ah2gESYSUloSoSZlISmRJhJSWhKzLSZXr5MO5TEJZIiw2Z6+fnW07RDSVgiMTJrppefb23BTCpFRVaTsFKmeZZ2LQdXfGrfTkzTnzJvJZipf5q++DLttoaZ+vztJDVJO2HOpFBUlDVxO8FMCkVFW9MXX8JMCkWVRU1KQFMizKQkNCXCTEpCUyLMpCQ0JcJMsRNHpiPiEhOJKouaOtMui58PmAmaotEui58PbqZt32FNQGJaUWVRU2faZfHzATNBUzQCsvjJ/FEysYZzS7sZ66PC+ywxraiyqKkzrVn8nPxRDWZCzwRNEWiXxY/BTDBTt7Rm8WvIHwUzQVN0WrP4efmjYCaYqTtas/gxN38UzAQzdUdrFj8vf9TitJdTavtpIQlITCuqLGrqTEAWPyd/VENOKf5mknbKYsVnUZMS0JQIMykJTYkwk5LQlAgzKQlNiTCTktCUCDMpCU2JMJOS0JTYq5loknatJg5Nib1F9Ye0XRPMH9Ou1cTJoplAStBsNppRgRBoNhvNqEAINJuNZlQgBJrNRjMqEALNZqMZFQiBZrPRjAqEQLPZaEYFQqDZbDSjAiHQbDaaUYEQaDYbzahACDSbjWZUIASazUYzKhACzWajGRUIgWaz0YwKhECz2WhGBUKg2Ww0owIh0Gw2mlGBEGg2G82oQAg0m41mVCAEms1GMyoQAs1moxkVCIFms9GMCoRAs9loRgVCoNlsNKMCIdBsNppRgRBoNhvNqEAINJutt6h+lnZWgWB+nnatJk4WzZS2a9qRdq0mDk2JyM+kJDQlwkxKQlMizKQkNCXCTEpCUyLMpCQ0JcJMSkJTIszUFXbHx8zbfXgIfeISU4sqi5o60o2ZxIPE1JOYWlRZ1NQRmCm5qLKoKRD3yZbBZuq8VRGJqUeVRU2BwEzJR5VFTYzJp1pa1lyFGfJpl/xhl1bNswt/crh4EH3gVrNmi+/KB/aWbPm8TK9IIhKTAGYKQDwJ3OQPnZ+ryKlPQ9/Dn/WsP2m3lZlWSb4tzGSV5OfdIolITASYKYD8UlGMXeJ/YZUWM7mfat0qn9HL35I9k3zHLZKKxESAmQJwuxE+nFmW1WIXm7/F2m0V/hEPp/eZCT3TjtTkTpnmKr4HyjdPsU2LWy14axszxThjymbFZ1ETd8J9aQ5nPAs6XisvFNttDRzm3CKpSEwEmCmA/JIlj9Ns7hJjquD1UcIuRkmaJXirM+cusaY5k1MkEYmJADMFoM8XnQVs23WAKRcDXLs4r4K3uqsBjcNcMc418SxWfBY1cVOIyY0dMMWJcjpF+Cd6kelITASYKQCb9zNipGrZsm0ztS0yHYmJADMFYbtr2i0btmum9kWmJDEJYCYloSkRZlKLp88IS4SZ1OL51vNnZCXCTGrxfGuL24mmxEya6ZOtjPP8FzQrHmZSkl++SLuWgyoeZlKQjz/5VdqVHFjxWTQTyajigc+ZPn76gqZEmEktnnMrUZUIM6nFr5++oCsRZlISmhJhJiWhKRFmUhKaEmEmJaEpEWZSEpoSYSYloSkRZlISmhIJm0lchu+7sjG/VNTno1yrSLOmY4WmxMTNZMhbD+s3mQVTv6PRo9lM/KJYI8oV+TRrOlZoSkzcTLZllbZtJv9L0SvJ+/sT1aQENCUmb6a53/B7FXs3k7wn1oxwfwfNmo4VmhL7YKYP+VglzeQkNBK3jxky+YPjIfmH4bursWQ6WWmcbEjR7zyjWdOxQlNiH8xUMayiNJOb0Eg4x3xYY/U5kHjLS3gkciNZ0kxuNiTZUUXJSkOzpmOFpsR+mIl7g1vCS2jE88voT+65d08zx0zedtmNmXUzuWluAofDmDUpAU2JfTFTeaHGLVFPaGRPFco3f/tppT6f5ibxtkvHuMOczIYEM9GX2BczMXvxd8JMnnXuT9s1fb5YP9KXZmqYQLlmktmQnFUCmImwxP6YKb/0ezHMuUd0+nzNLDK7ZHvHZnKYc7Y3DHPMlzoLcybSEvtjJn6YxifgbkIjZn92scKMW7NeNyNM4m3nE3DTmYB72ZBwNEddYp/MxMzGhEblBbFc4DiDZ8ISnZK7nSftq9lewlqxNCD7JDNChiOaNR0rNCUSPjfXhBj7wtY++x5VStCUqI6ZcG6OvESFzISrBqhLVMhMike1AyTCTEpCUyLMpCQ0JcJMSkJTYqbN9PJl2qEkLpEUGTbTy8+3nqYdSsISiZFZM738fGsLZlIpKrKahJUyzbO0azm44lP7dmKa/pR5K8FM/dP0xZdptzXM1OdvJ6lJ2glzJoWioqyJ2wlmUigq2pq++BJmUiiqLGpSApoSYSYloSkRZlISmhJhJiWhKRFmip0o9zwoLjGRqLKoqTO2c09yB2AmaIqGvEHZ6nRbMTdTlHtFqUpMK6osauqMc4NypyxRMBM0RcMxky/ZlJM/SibWcG5pN2N9VHifJaYVVRY1dUaYyRT3sjvJpJz8UQ1mQs8ETREQE3CZpLMhmRSDmWCmbrFFTrsi8yeb8uWPgpmgKTpymBOZNutHdDJ/FMwEM3WHzO1qFRtTaIj8UTATzNQdwkwii52bTMrLH7U47eWUipTgjqrEtKLKoqbOOCnHxOGcszTg5I9qyCnF30zSTlms+CxqUgKaEmEmJaEpEWZSEpoSYSYloSkRZlISmhJhJiWhKRFmUhKaEns1E03SrtXESbuCk6j4P6QdfDB/TLutEwcVDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEB0Jr9KJFX/8ntxlKI/mmCMbd7xhZi/4r7Q6+/qTyYSCSDS/qvy/+U7XZZ9W3xv0vua/ueJ7krwBfVG/avnzvNy9Te3Xdg2ub7BmN2SCVu/cf7r29txmP5ow/3TWDxfrd67VukxQP0GTxRo/LsvmuWVgn65Wq1WL83Wk8YbLUm7ygsrnYvOv+P+9f6q/Ojk+arH8koh6v7zb8lkhqYXQvmKW8xqJ4OVr03w7GMrXuHl+9Mz8nvXH0ZMkDgpd2qIh3dckH/LsMoXe6387hAZH1vNxMwa19V9ebLqhSBhI3uq11+H05i+Rw0YQR7JL915s8n9Zmnzo85lc+HX3/3m8ZVX1XXvDf/GiPt33/GZ6WbBKcHs2D3yDHbis4LJla9XpxmbecctIQr5t7j/Ls3y38GP5kR182gvV6uXrlSrV3v+NUenLprdbWiIGu+019t8y5wqiHSRDuJXel1E7ZnpgUgDWP6224Caig5ozPy3AbWsz9eY/peGDeWLFf1R55rkP13T36FFMVPr/vUnFcZ4hzL/VfWSzMfqM1PHLIflFcaWp93x0tll+eJEBzO11JDYg+F/R0R7mXd6b3db/91hWP7niZgf8J6Y/3NdPvah/MYr0TlPVavVq9YdJ0NtmB5eEaWCrHpeL/r1b67xYh698oYL2RBLlj+HZGjRerV6ae38bI0ZpbvrN8SH87cZO9cydCzz4PNrvvf1+WJLizTtvt4UnogmM0Xbf/k9pj/6a2PPdO2VU6/zDfuzrbq2y3I8u3eF9yvibddMPGoZesTK9+9av1y9OnV9boL/CoQtE4NnB/WZKf9GpakKnXHW90sM1tNQ6H/w98R049La32ZLBbYufnKyYF/pooHNenOGFy3t+ehvV6fW3/+04hXjFXlXzmucma+++tn5C86W5drmBGN2g5t4jZtNyZrNr0S/etPtGvJXhIw7vp4pbP9/LjgdQ+Aw55dYvv/3Zn1mg39nZCf/6vrcf3YwU2u7lm8WjFuecWTr2SVmJ5qY2l7867x/+C+yNmbiEb8dtcXPTbO8rGpvmCvfrFYvvcUNttr0ZKXyQq3+ZyQzyerJe41pTH3tzG4vicc2zTyeEL/yH00VNmetD0QByzXZ5vatjTa71+XQLBtb9qvCTP8oMLGv5mGu7f6vrriz5TAz6fMizW+j4JaR1ZCPDYpmJr1aXb5Z4KVwBzm/JKPEpx5v3r50pXppNuQopCd0n5mcWUaAmfh/Tjp2qcd9NBLPdVwyvSzazqjx3YRRYncv+Mx0riZnl8Jpnc3UuWj9xvTmBjOcVma+Yyen95x593t/8WKeJ7sqUfyDhVsNx6X+5jFKTsBu2MFm6rx/Zpy/YBfFqDX/FTc0azvM2XOVVjPJ7Xe9htBv/FfzMNe5howasxd/XL06Vb266I9Mv9HlSkVvZtqsuFXoDhisfP9VtXqjxivM0S30uI9GYqZ4JonU4zwnSQyXs0XRIvWjOcbslQdFxjYXSo3VZzQNcyFFz8x+MHHXa2VRRz/UGhqT6Y9e8XHq3Hl3uJpx7MOntrzfapDva01ppn9ueIdjAWaKsH9mtByxlVfcnunq9Lpfbt1MzpRpVg6zC6X6tKB5zhRSQ0aN6e80zEyMW+9eaJqTJ28mxu5WnQn4vQVnbeJmQTjCLLozA66n6dFIZl2PGz6XbkwV6maaWb2jz9/6/rvzTYryS3WNoUXr13+49nCa6d/9UPQa87tp58dcN9OTCn8hHkHA39MvSF1i6LtV8Wu3rDnfaz54/aPAymvumg73DD8CuXRRmina/vP8mNUv01kqEj1TddlyOwj+oI3mnin/1n/X1y/4LsvfNk/Awyrf8HmbdwkzqwslcWy54oz9/TKTp8FrX8dMdslwqp3r8R6NJLtdt6e1vafgLj+syYNxx0z6mxuFmbU7RmmzeQronwCHFq0/2hAl6vOfvefMWf45wcLM5KN8v9nMtu9hhfxLNRG9nGi19EyR9l9ee7x2ZaMgFzyX61MU07rWIF5UaLOZjKmv6ysado2Vvy00myms8g05bb86JbuE/Np7IjJegDsip2WmFTmDKN//oehvcd+Luh75nCQR+E8vVnhn6xvmHlybyM/6q6rFS5GKFiWWV2aWfvxpxRmLo5vJP+p6+ut9k1Fi31WEfluGZdeY7o5K/gl4x/3n3/i+/nnbG/HsFfurhnUu8djNpidv8uNbw3vDrpX/1bo0EFZDRvOoK//kY7zd6bGyyZuJRyZ+gyLeywW3p3U+0tDTegLFAyZrDa23+XiDzaz97q1pY6Xh4LxhmSdC0bLE5Wl2buPGtIgnopnERydbVwz9kyajVP7ImaybJdZh0bLz/v2ft909PrhZsGv5tWYzN/VM9orf8fZXFxh7v/pgqmmY61xDk4FmKq/95PZPt3MSYxtm8vcQDVU4/X713s0CM64trMijPfEULffRSGIO6D4TyX1OEvtu2q0lp2L0twu8Oid4N2v6Ds69x3nL3UcoWnaTK9Ln+m0WaKYbr6pXW3qmB9c2yo2nU8SPxOA9g9z9zF++2WCbt8XxtC7O09kf1M/NrdbNFLJ/fnLv3Y1GM02uFMSo1TzMimryKt+QjvFN2fjv8P573umU8BrSl2sPxD6aeyamX1+4leipXvG0Ud47BphppiAXC/ixu/FBYWZp6n++5WvGNfeLvB4anonkPCdpctoZH/2/shm+HM1XGPRlyz1BJ1agxVMpTT6djFC0s2jorGH970qwmdyeaWbVP4bMzC9uBKgvul6evFlg5ce31x2qF9r1TCH7v/zN2k++d424KoMWFyzwQWZmdtFbR20x0wNnqmYsnm9co9E3H3/D59jhNST6hvLaler65Y319fX3uQrXTMu3Vhc+6NeVA+6CvjzqEEenchWTTb4nDoqtSEPujBfv5tpDWU26GOVWH8pDxPXtH0/MrP4wV/nO8+KUN8zMrC540el/LriN23A2UV/u+PivfwqLbP79oetw/8UgjPEF9Ej7n1wRbnF6Jv7v5rviG2LGoi/fbNOeM4+8vRkLFp8N+HZfvh/xyWXyrN7m6kMxTecnemfeEBczbK6dL/AfVMIjXXvy/2L+C2Fm/q9LG+jLzs9Zvlxe6f2wdNJ3NYDOT146Vxix8pWmws+1XvxgR2yROPY/KcZU/9HrZKdFQ368W38185cYD+D1Rx9uPnrsFL/8Uc/lAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYuf/ActWj5r15ZdpAAAAAElFTkSuQmCC"},644:function(s,t,a){s.exports=a.p+"assets/img/20210321141145.ef7dff6f.png"},645:function(s,t,a){s.exports=a.p+"assets/img/20210321141224.8b50762c.jpg"},646:function(s,t,a){s.exports=a.p+"assets/img/20210321141225.aaa9397a.jpg"},647:function(s,t,a){s.exports=a.p+"assets/img/20210321141226.8b157fcd.jpg"},743:function(s,t,a){"use strict";a.r(t);var n=a(7),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h2",{attrs:{id:"redis-安装、启动与停止"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#redis-安装、启动与停止"}},[s._v("#")]),s._v(" Redis 安装、启动与停止")]),s._v(" "),n("div",{staticClass:"language-sh line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-sh"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解压文件")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -z或--gzip或--ungzip 通过gzip指令处理备份文件。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -x或--extract或--get 从备份文件中还原文件。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -v或--verbose 显示指令执行过程。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -f<备份文件>或--file=<备份文件> 指定备份文件。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -zxvf redis-6.0.9.tar.gz\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 进入Redis解压目录")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" redis-6.0.9\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 编译")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 如果出现 “cc:命令未找到” 报错,需要安装gcc")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Centos中使用yum来安装gcc(这种方式需要能上网)")]),s._v("\nyum -y "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" gcc\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 若要安装g++,则输入(这种方式需要能上网)")]),s._v("\nyum -y "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" gcc-c++\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 如果出现 “zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录” 报错")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("MALLOC")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("libc\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 继续报错,server.c:5343:176: 错误:‘struct redisServer’没有名为‘maxmemory’的成员")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 参考https://blog.csdn.net/Mr_FenKuan/article/details/111072880")]),s._v("\nyum "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" centos-release-scl -y\nyum "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" devtoolset-9-gcc\nscl "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" devtoolset-9 "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bash")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看Redis安装位置")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("whereis")]),s._v(" redis-cli\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("whereis")]),s._v(" redis-server\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br")])]),s._v(" "),n("img",{attrs:{src:a(642)}}),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("文件")]),s._v(" "),n("th",[s._v("说明")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("redis-server")]),s._v(" "),n("td",[s._v("Redis服务器")])]),s._v(" "),n("tr",[n("td",[s._v("redis-cli")]),s._v(" "),n("td",[s._v("Redis客户端")])]),s._v(" "),n("tr",[n("td",[s._v("redis-benchmark")]),s._v(" "),n("td",[s._v("Redis性能测试")])]),s._v(" "),n("tr",[n("td",[s._v("redis-sentinel")]),s._v(" "),n("td",[s._v("Redis哨兵,用于主从复制、分片集群,保证高可用")])]),s._v(" "),n("tr",[n("td",[s._v("redis-check-rdb")]),s._v(" "),n("td",[s._v("检查RDB文件")])]),s._v(" "),n("tr",[n("td",[s._v("redis-check-aof")]),s._v(" "),n("td",[s._v("检查AOF文件")])])])]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 指定配置文件启动Redis服务器")]),s._v("\n/usr/local/bin/redis-server /opt/redis/redis.conf\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 指定某端口号启动Redis客户端")]),s._v("\n/usr/local/bin/redis-cli -p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 测试连接")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ping")]),s._v("\nPONG\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 停止Redis服务")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("shutdown")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 退出Redis客户端")]),s._v("\nnot connected"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exit")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost redis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ps -ef|grep redis")]),s._v("\nroot "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12324")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10325")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("20")]),s._v(":41 pts/1 00:00:00 "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" --color"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("auto redis\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 测试性能")]),s._v("\nredis-benchmark -h "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 -p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("h2",{attrs:{id:"redis-基本操作"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#redis-基本操作"}},[s._v("#")]),s._v(" Redis 基本操作")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Redis有16个数据库,默认0号库,可以使用select切换库")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 返回当前数据库中 key 的数量")]),s._v("\ndbsize\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查找所有符合给定模式 的 key")]),s._v("\nkeys *\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查给定 key 是否存在")]),s._v("\nexists key\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除给定的一个或多个 key")]),s._v("\ndel key\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 设置过期时间")]),s._v("\nexpire key seconds\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看存活时间,即还有多少秒过期")]),s._v("\nttl key\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 以字符串的形式返回存储在 key 中的值的类型")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("type")]),s._v(" key\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 清空当前库")]),s._v("\nflushdb\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 清空所有库")]),s._v("\nflushall\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# config get 配置项,查看配置信息")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" config get port\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"port"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6379"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" config get "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("dir")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"dir"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/opt/redis"')]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br")])]),n("h2",{attrs:{id:"redis-数据类型"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#redis-数据类型"}},[s._v("#")]),s._v(" Redis 数据类型")]),s._v(" "),n("h3",{attrs:{id:"基本数据类型"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#基本数据类型"}},[s._v("#")]),s._v(" 基本数据类型")]),s._v(" "),n("h4",{attrs:{id:"string-字符串"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#string-字符串"}},[s._v("#")]),s._v(" String(字符串)")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将键 key 的值设置为 value,如果 key 已存在,则覆盖已有值")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" key value\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将键 key 的值设置为 value,并将键 key 的生存时间设置为 seconds 秒,如果 key 已存在,则覆盖已有值")]),s._v("\nsetex key seconds value\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 如果 key 不存在,则将键 key 的值设置为 value,否则什么都不做")]),s._v("\nsetnx key value\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 获取")]),s._v("\nget key\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将键 key 的值设为 value , 并返回键 key 在被设置之前的旧值")]),s._v("\ngetset key value\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 批量设置")]),s._v("\nmset key value "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("key value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 批量获取")]),s._v("\nmget key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 自增1")]),s._v("\nincr key\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 增加指定步长")]),s._v("\nincrby key increment\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 自减1")]),s._v("\ndecr key\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 减去指定步长")]),s._v("\ndecrby key decrement\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br")])]),n("h4",{attrs:{id:"list-双向列表"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#list-双向列表"}},[s._v("#")]),s._v(" List(双向列表)")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# lpush key element [element ...] 将一个或多个值依次插入到键为key的列表的头部")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" lpush list "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" \n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("integer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# rpush key element [element ...] 将一个或多个值依次插入到键为key的列表的底部")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" rpush list "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("integer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# lrange key start stop 返回列表中指定区间内的元素,-1表示最后一个元素")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" lrange list "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" -1\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"2"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"3"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"4"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"5"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6"')]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# llen key 返回列表元素个数")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" llen list\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("integer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# lpop key [count] 用于删除并返回列表头部的元素")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" lpop list\n"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" lrange list "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" -1\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"2"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"3"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"4"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"5"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" lpop list "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"2"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"3"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" lrange list "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" -1\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"4"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"5"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6"')]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# rpop key [count] 用于删除并返回列表底部的元素")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" rpop list\n"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"6"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" lrange list "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" -1\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"2"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"3"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"4"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"5"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" rpop list "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"5"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"4"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" lrange list "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" -1\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"1"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"2"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"3"')]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# linsert key BEFORE|AFTER pivot element 在指定元素前或后插入新元素")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# lindex key index 获取指定索引的元素")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# lpos key element [RANK rank] [COUNT num-matches] [MAXLEN len] 获取指定元素的索引")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br"),n("span",{staticClass:"line-number"},[s._v("56")]),n("br"),n("span",{staticClass:"line-number"},[s._v("57")]),n("br"),n("span",{staticClass:"line-number"},[s._v("58")]),n("br")])]),n("h4",{attrs:{id:"set-无序集合"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#set-无序集合"}},[s._v("#")]),s._v(" Set(无序集合)")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 添加")]),s._v("\nsadd key member "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("member "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 随机删除成员并返回被删除的成员")]),s._v("\nspop key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("count"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 返回集合中所有成员")]),s._v("\nsmembers key \n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 返回集合中随机成员")]),s._v("\nsrandmember key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("count"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 判断成员是否存在")]),s._v("\nsismember key member\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 返回集合中元素个数")]),s._v("\nscard key\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 差集,返回第一个集合与其他集合之间的差异,也可以认为说第一个集合中独有的元素")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sdiff")]),s._v(" key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 交集")]),s._v("\nsinter key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 并集")]),s._v("\nsunion key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br")])]),n("h4",{attrs:{id:"zset-有序集合"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#zset-有序集合"}},[s._v("#")]),s._v(" Zset(有序集合)")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 添加")]),s._v("\nzadd key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("NX"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("XX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("GT"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("LT"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("CH"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("INCR"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" score member "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("score member "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除并返回得分最高的元素")]),s._v("\nzpopmax key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("count"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除并返回得分最低的元素")]),s._v("\nzpopmin key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("count"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 返回指定区间中的元素,-1表示最后一个元素")]),s._v("\nzrange key min max "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("BYSCORE"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("BYLEX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("REV"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("LIMIT offset count"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("WITHSCORES"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 返回集合中元素个数")]),s._v("\nzcard key\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br")])]),n("h4",{attrs:{id:"hash-哈希表"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#hash-哈希表"}},[s._v("#")]),s._v(" Hash(哈希表)")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 创建哈希表并赋值或者覆盖值")]),s._v("\nhset key field value "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("field value "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 返回哈希表中指定字段 field 的值")]),s._v("\nhget key field\n\nhmset key field value "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("field value "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\nhmget key field "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("field "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 返回存储在 key 中哈希表的所有域")]),s._v("\nhkeys key\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 返回存储在 key 中哈希表的所有值")]),s._v("\nhvals key\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 返回哈希表中所有域和值")]),s._v("\nhgetall\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除返回哈希表中指定域")]),s._v("\nhdel key field "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("field "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br")])]),n("h3",{attrs:{id:"特殊数据类型"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#特殊数据类型"}},[s._v("#")]),s._v(" 特殊数据类型")]),s._v(" "),n("h4",{attrs:{id:"hyperloglog"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#hyperloglog"}},[s._v("#")]),s._v(" HyperLogLog")]),s._v(" "),n("p",[s._v("HyperLogLog 是用来做基数统计的算法。每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 264 个不同元素的基数。")]),s._v(" "),n("p",[s._v("比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 添加指定元素到 HyperLogLog 中")]),s._v("\npfadd key element "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("element "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 返回给定 HyperLogLog 的基数估算值")]),s._v("\npfcount key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将多个 HyperLogLog 合并为一个 HyperLogLog")]),s._v("\npfmerge destkey sourcekey "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("sourcekey "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("h4",{attrs:{id:"geo"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#geo"}},[s._v("#")]),s._v(" GEO")]),s._v(" "),n("p",[s._v("GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 添加地理位置的坐标")]),s._v("\ngeoadd key "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("NX"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("XX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("CH"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" longitude latitude member "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("longitude latitude member "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 获取地理位置的坐标")]),s._v("\ngeopos key member "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("member "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 计算两个位置之间的距离")]),s._v("\ngeodist key member1 member2 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("m"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("km"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("ft"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("mi"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合")]),s._v("\ngeoradius key longitude latitude radius m"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("km"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("ft"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("mi "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("WITHCOORD"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("WITHDIST"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("WITHHASH"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("COUNT count "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("ANY"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("ASC"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("DESC"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("STORE key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("STOREDIST key"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" geoadd city "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("116.23128")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("40.22077")]),s._v(" beijing "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("121.48941")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("31.40527")]),s._v(" shanghai "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("113.27324")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("23.15792")]),s._v(" guangzhou "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("113.88308")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("22.55329")]),s._v(" shenzhen\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("integer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" geopos city shenzhen\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"113.88307839632034302"')]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"22.55329111565713873"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" geodist city guangzhou shenzhen km\n"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"91.8118"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" georadius city "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("50")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" km\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("empty array"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" georadius city "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("50")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),s._v(" km\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("empty array"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" georadius city "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("50")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10000")]),s._v(" km\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"shenzhen"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"guangzhou"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"shanghai"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"beijing"')]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br")])]),n("h4",{attrs:{id:"bitmap"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#bitmap"}},[s._v("#")]),s._v(" BitMap")]),s._v(" "),n("p",[s._v("位图")]),s._v(" "),n("h2",{attrs:{id:"redis-事务操作"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#redis-事务操作"}},[s._v("#")]),s._v(" Redis 事务操作")]),s._v(" "),n("p",[s._v("Redis的事务不是严格意义上的事务,单个命令执行是原子性的。")]),s._v(" "),n("p",[s._v("一个事务从开始到执行会经历以下三个阶段:")]),s._v(" "),n("ul",[n("li",[s._v("开启事务 multi")]),s._v(" "),n("li",[s._v("命令入队")]),s._v(" "),n("li",[s._v("执行事务 exec / 取消事务 discard")])]),s._v(" "),n("p",[s._v("multi、exec、discard、watch 这四个指令构成了 Redis 事务处理的基础。")]),s._v(" "),n("ul",[n("li",[s._v("multi 用来组装一个事务;")]),s._v(" "),n("li",[s._v("exec 用来执行一个事务;")]),s._v(" "),n("li",[s._v("discard 用来取消一个事务;")]),s._v(" "),n("li",[s._v("watch 监视一个(或多个) key,一旦这些 key 在事务执行之前被改变,则取消事务的执行;")]),s._v(" "),n("li",[s._v("unwatch 取消 watch 命令对所有 key 的监视。")])]),s._v(" "),n("p",[s._v("正常情况")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 开启事务")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" multi\nOK\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 命令入队")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k1 v1\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k2 v2\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" get k1\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" get k2\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k3 v3\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 执行事务")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exec")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" OK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" OK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"v1"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"v2"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" OK\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br")])]),n("p",[s._v("编译时异常(语法错误,命令都不执行)")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" multi \nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k1 v1\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k2 v2\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" suibianshuru666\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("error"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" ERR unknown "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("suibianshuru666"),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v(", with args beginning with: \n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k3 v3\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exec")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("error"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" EXECABORT Transaction discarded because of previous errors.\n\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br")])]),n("p",[s._v("运行时异常(其他错误,命令部分执行)")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" multi\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k1 v1\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k2 v2\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" incr k1\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k3 v3\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exec")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" OK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" OK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("error"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" ERR value is not an integer or out of range\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" OK\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("p",[s._v("乐观锁")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("watch")]),s._v(" balance "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 监听余额")]),s._v("\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" multi\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" decrby balance "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 扣减余额")]),s._v("\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" incrby paymeng "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 新增支出")]),s._v("\nQUEUED\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("TX"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exec")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 执行事务,如果在执行事务之前balance被修改,则事务执行失败")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("integer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("9990")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("integer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("h2",{attrs:{id:"redis-发布订阅"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#redis-发布订阅"}},[s._v("#")]),s._v(" Redis 发布订阅")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 订阅一个或多个频道的信息")]),s._v("\nsubscribe channel "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("channel "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将信息发送到指定频道")]),s._v("\npublish channel message\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 退订一个或多个频道")]),s._v("\nunsubscribe "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("channel "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("channel "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("h2",{attrs:{id:"redis-配置文件"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#redis-配置文件"}},[s._v("#")]),s._v(" Redis 配置文件")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("################################# GENERAL #####################################")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# By default Redis does not run as a daemon. Use 'yes' if you need it.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# When Redis is supervised by upstart or systemd, this parameter has no impact.")]),s._v("\ndaemonize "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yes")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将no改为yes")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("h2",{attrs:{id:"redis-持久化"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#redis-持久化"}},[s._v("#")]),s._v(" Redis 持久化")]),s._v(" "),n("p",[s._v("Redis 提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。")]),s._v(" "),n("ol",[n("li",[s._v("默认开启RDB,关闭AOF;")]),s._v(" "),n("li",[s._v("如果RDB和AOF同时存在,则优先采用AOF方式,这是因为AOF方式的数据恢复完整度更高;")]),s._v(" "),n("li",[s._v("不管是RDB还是AOF,主线程负责接收客户端请求进行读写操作,新开启的线程负责生成RDB或AOF文件。")])]),s._v(" "),n("h3",{attrs:{id:"rdb-redis-database"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#rdb-redis-database"}},[s._v("#")]),s._v(" RDB(Redis DataBase)")]),s._v(" "),n("p",[n("strong",[s._v("RDB,在一定的时间窗口内进行了指定次数的写操作,则将Redis存储的数据生成快照并存储到磁盘等介质中。")])]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("################################ SNAPSHOTTING ################################")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Save the DB to disk.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# save ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Redis will save the DB if both the given number of seconds and the given")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# number of write operations against the DB occurred.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Snapshotting can be completely disabled with a single empty string argument")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# as in following example:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# save "" # 禁用RDB')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Unless specified otherwise, by default Redis will save the DB:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * After 3600 seconds (an hour) if at least 1 key changed")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * After 300 seconds (5 minutes) if at least 100 keys changed")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * After 60 seconds if at least 10000 keys changed")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# You can set these explicitly by uncommenting the three following lines.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# save 3600 1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# save 300 100")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# save 60 10000")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The filename where to dump the DB")]),s._v("\ndbfilename dump.rdb\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The working directory.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The DB will be written inside this directory, with the filename specified")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# above using the 'dbfilename' configuration directive.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The Append Only File will also be created inside this directory.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Note that you must specify a directory here, not a file name.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("dir")]),s._v(" ./\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br")])]),n("p",[s._v("dump.rdb在以下情况时会生成:")]),s._v(" "),n("ol",[n("li",[s._v("满足配置文件的条件,在一定的时间窗口内进行了指定次数的写操作;")])]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Unless specified otherwise, by default Redis will save the DB:")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * After 3600 seconds (an hour) if at least 1 key changed")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * After 300 seconds (5 minutes) if at least 100 keys changed")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * After 60 seconds if at least 10000 keys changed")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# You can set these explicitly by uncommenting the three following lines.")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# save 3600 1")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# save 300 100")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# save 60 10000")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br")])]),n("ol",{attrs:{start:"2"}},[n("li",[n("p",[s._v("执行 "),n("code",[s._v("save")]),s._v(" 命令;")])]),s._v(" "),n("li",[n("p",[s._v("执行 "),n("code",[s._v("flushdb")]),s._v(" 命令;")])]),s._v(" "),n("li",[n("p",[s._v("执行 "),n("code",[s._v("flushall")]),s._v(" 命令;")])]),s._v(" "),n("li",[n("p",[s._v("执行 "),n("code",[s._v("shutdown")]),s._v(" 命令。")])])]),s._v(" "),n("h3",{attrs:{id:"aof-append-only-file"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#aof-append-only-file"}},[s._v("#")]),s._v(" AOF(Append Only File)")]),s._v(" "),n("p",[s._v("AOF,是将在Redis中执行的所有写指令记录下来,在下次Redis服务启动的时候,将这些写指令从前到后执行一遍,实现数据恢复。")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("############################## APPEND ONLY MODE ###############################")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# By default Redis asynchronously dumps the dataset on disk. This mode is")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# good enough in many applications, but an issue with the Redis process or")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# a power outage may result into a few minutes of writes lost (depending on")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# the configured save points).")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The Append Only File is an alternative persistence mode that provides")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# much better durability. For instance using the default data fsync policy")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# (see later in the config file) Redis can lose just one second of writes in a")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# dramatic event like a server power outage, or a single write if something")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# wrong with the Redis process itself happens, but the operating system is")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# still running correctly.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# AOF and RDB persistence can be enabled at the same time without problems.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# If the AOF is enabled on startup Redis will load the AOF, that is the file")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# with the better durability guarantees.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Please check http://redis.io/topics/persistence for more information.")]),s._v("\n\nappendonly no "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 是否开启AOF方式")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# The name of the append only file (default: "appendonly.aof")')]),s._v("\n\nappendfilename "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"appendonly.aof"')]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The fsync() call tells the Operating System to actually write data on disk")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# instead of waiting for more data in the output buffer. Some OS will really flush")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# data on disk, some other OS will just try to do it ASAP.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Redis supports three different modes:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# no: don't fsync, just let the OS flush the data when it wants. Faster.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# always: fsync after every write to the append only log. Slow, Safest.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# everysec: fsync only one time every second. Compromise.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# The default is "everysec", as that\'s usually the right compromise between')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# speed and data safety. It's up to you to understand if you can relax this to")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# "no" that will let the operating system flush the output buffer when')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# it wants, for better performances (but if you can live with the idea of")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# some data loss consider the default persistence mode that's snapshotting),")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# or on the contrary, use "always" that\'s very slow but a bit safer than')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# everysec.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# More details please check the following article:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# http://antirez.com/post/redis-persistence-demystified.html")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# If unsure, use "everysec".')]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# appendfsync always")]),s._v("\nappendfsync everysec\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# appendfsync no")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br")])]),n("h2",{attrs:{id:"redis-主从复制"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#redis-主从复制"}},[s._v("#")]),s._v(" Redis 主从复制")]),s._v(" "),n("p",[s._v("测试主从复制:同一机器创建三个配置文件,启动三个不同端口号的Redis服务,并分别使用三个客户端连接。")]),s._v(" "),n("p",[s._v("配置文件如下:")]),s._v(" "),n("p",[s._v("redis_6379.conf")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 公用配置")]),s._v("\ninclude /opt/redis/redis.conf\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 个性化配置")]),s._v("\nport "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\npidfile /var/run/redis_6379.pid\nlogfile "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"redis_6379.log"')]),s._v("\ndbfilename dump_6379.rdb\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("p",[s._v("redis_6380.conf")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 公用配置")]),s._v("\ninclude /opt/redis/redis.conf\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 个性化配置")]),s._v("\nport "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6380")]),s._v("\npidfile /var/run/redis_6380.pid\nlogfile "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"redis_6380.log"')]),s._v("\ndbfilename dump_6380.rdb\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("p",[s._v("redis_6381.conf")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 公用配置")]),s._v("\ninclude /opt/redis/redis.conf\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 个性化配置")]),s._v("\nport "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6381")]),s._v("\npidfile /var/run/redis_6381.pid\nlogfile "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"redis_6381.log"')]),s._v("\ndbfilename dump_6381.rdb\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("p",[s._v("启动服务,连接客户端")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动服务器")]),s._v("\n/usr/local/bin/redis-server /opt/redis/redis_6379.conf\n/usr/local/bin/redis-server /opt/redis/redis_6380.conf\n/usr/local/bin/redis-server /opt/redis/redis_6381.conf\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动客户端")]),s._v("\n/usr/local/bin/redis-cli -p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n/usr/local/bin/redis-cli -p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6380")]),s._v("\n/usr/local/bin/redis-cli -p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6381")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("p",[s._v("使用 "),n("code",[s._v("info replication")]),s._v(" 查看主从配置,Redis服务器启动默认是master节点。")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" info replication\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Replication")]),s._v("\nrole:master\nconnected_slaves:0\nmaster_failover_state:no-failover\nmaster_replid:d8ddf17b411a6e03263cf8f870bd1c2b5fd6e732\nmaster_replid2:0000000000000000000000000000000000000000\nmaster_repl_offset:0\nsecond_repl_offset:-1\nrepl_backlog_active:0\nrepl_backlog_size:1048576\nrepl_backlog_first_byte_offset:0\nrepl_backlog_histlen:0\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br")])]),n("p",[s._v("使用 "),n("code",[s._v("slaveof host port")]),s._v(" 手动绑定主从,或者在配置文件中配置 "),n("code",[s._v("replicaof ")])]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:638"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("0")]),s._v(">")]),s._v(" slaveof "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:638"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("0")]),s._v(">")]),s._v(" info replication\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Replication")]),s._v("\nrole:slave\nmaster_host:127.0.0.1\nmaster_port:6379\nmaster_link_status:up\nmaster_last_io_seconds_ago:10\nmaster_sync_in_progress:0\nslave_repl_offset:112\nslave_priority:100\nslave_read_only:1\nconnected_slaves:0\nmaster_failover_state:no-failover\nmaster_replid:02496d2e289dd49a98a6f8dde2c153fb1587ba6e\nmaster_replid2:0000000000000000000000000000000000000000\nmaster_repl_offset:112\nsecond_repl_offset:-1\nrepl_backlog_active:1\nrepl_backlog_size:1048576\nrepl_backlog_first_byte_offset:1\nrepl_backlog_histlen:112\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br")])]),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" info replication\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Replication")]),s._v("\nrole:master\nconnected_slaves:2\nslave0:ip"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1,port"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6380")]),s._v(",state"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("online,offset"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("126")]),s._v(",lag"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\nslave1:ip"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1,port"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6381")]),s._v(",state"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("online,offset"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("126")]),s._v(",lag"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\nmaster_failover_state:no-failover\nmaster_replid:02496d2e289dd49a98a6f8dde2c153fb1587ba6e\nmaster_replid2:0000000000000000000000000000000000000000\nmaster_repl_offset:126\nsecond_repl_offset:-1\nrepl_backlog_active:1\nrepl_backlog_size:1048576\nrepl_backlog_first_byte_offset:1\nrepl_backlog_histlen:126\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("p",[s._v("使用 "),n("code",[s._v("slaveof no one")]),s._v(" 解绑主从")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:638"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("1")]),s._v(">")]),s._v(" slaveof no one\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:638"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("1")]),s._v(">")]),s._v(" info replication\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Replication")]),s._v("\nrole:master\nconnected_slaves:0\nmaster_failover_state:no-failover\nmaster_replid:954afb72e238ca2fe9b2e84009d52585207ab7c3\nmaster_replid2:02496d2e289dd49a98a6f8dde2c153fb1587ba6e\nmaster_repl_offset:361\nsecond_repl_offset:362\nrepl_backlog_active:1\nrepl_backlog_size:1048576\nrepl_backlog_first_byte_offset:29\nrepl_backlog_histlen:333\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("blockquote",[n("p",[s._v("使用 slaveof host port 绑定主从,会有两个问题:")]),s._v(" "),n("ol",[n("li",[s._v("主服务器宕机,从服务器群龙无首;")]),s._v(" "),n("li",[s._v("从服务器断开,重新连接时,需要手动执行slaveof绑定主从。")])]),s._v(" "),n("p",[s._v("为了解决以上问题,引用哨兵模式。")])]),s._v(" "),n("p",[n("strong",[s._v("哨兵模式,是从服务器经过投票选举,票数高的自动提升为主服务器。")])]),s._v(" "),n("p",[s._v("sentinel.conf")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# By default Redis Sentinel does not run as a daemon. Use 'yes' if you need it.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Note that Redis will write a pid file in /var/run/redis-sentinel.pid when")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# daemonized.")]),s._v("\ndaemonize "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yes")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 以守护进程启动哨兵")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# sentinel monitor ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Tells Sentinel to monitor this master, and to consider it in O_DOWN")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# (Objectively Down) state only if at least sentinels agree.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Note that whatever is the ODOWN quorum, a Sentinel will require to")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# be elected by the majority of the known Sentinels in order to")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# start a failover, so no failover can be performed in minority.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Replicas are auto-discovered, so you don't need to specify replicas in")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# any way. Sentinel itself will rewrite this configuration file adding")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# the replicas using additional configuration options.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Also note that the configuration file is rewritten when a")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# replica is promoted to master.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Note: master name should not include special characters or spaces.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# The valid charset is A-z 0-9 and the three characters ".-_".')]),s._v("\nsentinel monitor mymaster "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 1表示执行故障恢复操作前至少需要几个哨兵节点同意。因为只有两个从节点,因此这个数值(quorum)只能设置为1")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br")])]),n("p",[s._v("启动哨兵")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("/usr/local/bin/redis-sentinel /opt/redis/sentinel.conf\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("关掉6379,查看哨兵日志")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost redis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /usr/local/bin/redis-sentinel /opt/redis/sentinel.conf")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":04:21.330 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":04:21.331 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Redis version=6.2.1, bits=64, commit=00000000, modified=0, pid=6189, just started")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":04:21.331 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Configuration loaded")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":04:21.331 * Increased maximum number of "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("open")]),s._v(" files to "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10032")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("it was originally "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" to "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1024")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(".\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":04:21.331 * monotonic clock: POSIX clock_gettime\n _._ \n _.-`"),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("__ "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("''")]),s._v("-._ \n _.-"),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("_. "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("''")]),s._v("-._ Redis "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6.2")]),s._v(".1 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("00000000/0"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("64")]),s._v(" bit\n .-"),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v(" .-"),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("`"),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("`"),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("/ _.,_ "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("''")]),s._v("-._ \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v(" ' , .-"),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v(", "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" Running "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" sentinel mode\n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("-._"),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("-"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".-"),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v(" __"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".-.`"),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("-._"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("'"),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v(" _.-"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'| Port: 26379\n | `-._ `._ / _.-'")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" PID: "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("-._ "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("-._ "),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("-./ _.-"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("' _.-'")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("-._"),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("-._ "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("-.__.-"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("' _.-'")]),s._v("_.-"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'| \n | `-._`-._ _.-'")]),s._v("_.-"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("' | http://redis.io \n `-._ `-._`-.__.-'")]),s._v("_.-"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("' _.-'")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("-._"),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("-._ "),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("-.__.-"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("' _.-'")]),s._v("_.-'"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("-._"),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("-._ _.-"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'_.-'")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" \n "),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("-._ "),n("span",{pre:!0,attrs:{class:"token variable"}},[n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),s._v("-._"),n("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("-.__.-"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'_.-'")]),s._v(" _.-"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("' \n `-._ `-.__.-'")]),s._v(" _.-"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("' \n `-._ _.-'")]),s._v(" \n `-.__.-' \n\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":04:21.332 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":04:21.334 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Sentinel ID is 2fecb2124682385875472f734a46504ae74760fa")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":04:21.334 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +monitor master mymaster 127.0.0.1 6379 quorum 1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":04:21.335 * +slave slave "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6380 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6380")]),s._v(" @ mymaster "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":04:21.337 * +slave slave "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6381 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6381")]),s._v(" @ mymaster "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:14.936 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +sdown master mymaster 127.0.0.1 6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:14.936 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +odown master mymaster 127.0.0.1 6379 #quorum 1/1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:14.936 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +new-epoch 1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:14.936 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +try-failover master mymaster 127.0.0.1 6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:14.941 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +vote-for-leader 2fecb2124682385875472f734a46504ae74760fa 1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:14.941 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +elected-leader master mymaster 127.0.0.1 6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:14.941 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +failover-state-select-slave master mymaster 127.0.0.1 6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:15.018 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:15.018 * +failover-state-send-slaveof-noone slave "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6380 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6380")]),s._v(" @ mymaster "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:15.118 * +failover-state-wait-promotion slave "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6380 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6380")]),s._v(" @ mymaster "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:15.331 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:15.331 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +failover-state-reconf-slaves master mymaster 127.0.0.1 6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:15.361 * +slave-reconf-sent slave "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6381 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6381")]),s._v(" @ mymaster "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:16.325 * +slave-reconf-inprog slave "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6381 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6381")]),s._v(" @ mymaster "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:16.325 * +slave-reconf-done slave "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6381 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6381")]),s._v(" @ mymaster "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:16.425 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +failover-end master mymaster 127.0.0.1 6379")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:16.425 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:16.425 * +slave slave "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6381 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6381")]),s._v(" @ mymaster "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6380")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:16.425 * +slave slave "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v(" @ mymaster "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6380")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":05:46.468 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":06:09.740 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6189")]),s._v(":X "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("21")]),s._v(" Mar "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2021")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":06:19.731 * +convert-to-slave slave "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:6379 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v(" @ mymaster "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6380")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br")])]),n("h2",{attrs:{id:"redis-集群"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#redis-集群"}},[s._v("#")]),s._v(" Redis 集群")]),s._v(" "),n("p",[s._v("Redis 集群,数据自动在多个Redis节点间分片。")]),s._v(" "),n("p",[s._v("Redis集群提供的能力:")]),s._v(" "),n("ol",[n("li",[s._v("自动切分数据集到多个节点上。")]),s._v(" "),n("li",[s._v("当部分节点故障或不可达的情况下继续提供服务。")])]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动服务")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost redis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /usr/local/bin/redis-server /opt/redis/cluster/redis_6379.conf")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost redis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /usr/local/bin/redis-server /opt/redis/cluster/redis_6380.conf")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost redis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /usr/local/bin/redis-server /opt/redis/cluster/redis_6381.conf")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost redis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /usr/local/bin/redis-server /opt/redis/cluster/redis_6389.conf")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost redis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /usr/local/bin/redis-server /opt/redis/cluster/redis_6390.conf")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost redis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /usr/local/bin/redis-server /opt/redis/cluster/redis_6391.conf")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost redis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ps -ef|grep redis")]),s._v("\nroot "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8545")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":39 ? 00:00:00 /usr/local/bin/redis-server *:6379 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("cluster"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\nroot "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8550")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":39 ? 00:00:00 /usr/local/bin/redis-server *:6380 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("cluster"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\nroot "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8567")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":40 ? 00:00:00 /usr/local/bin/redis-server *:6381 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("cluster"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\nroot "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8572")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":40 ? 00:00:00 /usr/local/bin/redis-server *:6389 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("cluster"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\nroot "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8577")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":40 ? 00:00:00 /usr/local/bin/redis-server *:6390 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("cluster"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\nroot "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8582")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":40 ? 00:00:00 /usr/local/bin/redis-server *:6391 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("cluster"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\nroot "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8672")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2228")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("13")]),s._v(":40 pts/0 00:00:00 "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" --color"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("auto redis\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 创建集群,选项 --cluster-replicas 1 表示为每一个主服务器配一个从服务器")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ./redis-cli --cluster create ${IP}:${PORT} ${IP}:${PORT} ${IP}:${PORT} ${IP}:${PORT} ${IP}:${PORT} ${IP}:${PORT} --cluster-replicas 1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost redis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /usr/local/bin/redis-cli --cluster create 192.168.66.133:6379 192.168.66.133:6380 192.168.66.133:6381 192.168.66.133:6389 192.168.66.133:6390 192.168.66.133:6391 --cluster-replicas 1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Performing "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("hash")]),s._v(" slots allocation on "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6")]),s._v(" nodes"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\nMaster"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" -"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Slots "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" - "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5460")]),s._v("\nMaster"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" -"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Slots "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5461")]),s._v(" - "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10922")]),s._v("\nMaster"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" -"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Slots "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10923")]),s._v(" - "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("16383")]),s._v("\nAdding replica "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6390 to "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6379\nAdding replica "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6391 to "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6380\nAdding replica "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6389 to "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6381\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Trying to optimize slaves allocation "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" anti-affinity\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("WARNING"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" Some slaves are "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" the same "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("host")]),s._v(" as their master\nM: b8a032204ae864920827c9825bc1df5c2bf19f8f "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6379\n slots:"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("-5460"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5461")]),s._v(" slots"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" master\nM: a970ee79f6939aa6f15dbba55e7cfc32f4de193f "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6380\n slots:"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5461")]),s._v("-10922"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5462")]),s._v(" slots"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" master\nM: 79074d9fe1f4d59bc6e027c326112094ade7bf93 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6381\n slots:"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10923")]),s._v("-16383"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5461")]),s._v(" slots"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" master\nS: d656dba4a474c9c840c44ce90d8ef847b36fff47 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6389\n replicates b8a032204ae864920827c9825bc1df5c2bf19f8f\nS: 2a54c3642936c5b19751d50664811df5f87696a3 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6390\n replicates a970ee79f6939aa6f15dbba55e7cfc32f4de193f\nS: 78fee4677ca3aeba72e7432926f887c0e0417aa5 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6391\n replicates 79074d9fe1f4d59bc6e027c326112094ade7bf93\nCan I "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" the above configuration? "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("type "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'yes'")]),s._v(" to accept"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(": "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("yes")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Nodes configuration updated\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Assign a different config epoch to each node\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Sending CLUSTER MEET messages to "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("join")]),s._v(" the cluster\nWaiting "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" the cluster to "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("join")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Performing Cluster Check "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("using node "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6379"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nM: b8a032204ae864920827c9825bc1df5c2bf19f8f "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6379\n slots:"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("-5460"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5461")]),s._v(" slots"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" master\n "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" additional replica"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nS: d656dba4a474c9c840c44ce90d8ef847b36fff47 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6389\n slots: "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" slots"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" slave\n replicates b8a032204ae864920827c9825bc1df5c2bf19f8f\nM: a970ee79f6939aa6f15dbba55e7cfc32f4de193f "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6380\n slots:"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5461")]),s._v("-10922"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5462")]),s._v(" slots"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" master\n "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" additional replica"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nM: 79074d9fe1f4d59bc6e027c326112094ade7bf93 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6381\n slots:"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10923")]),s._v("-16383"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("5461")]),s._v(" slots"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" master\n "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" additional replica"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\nS: 78fee4677ca3aeba72e7432926f887c0e0417aa5 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6391\n slots: "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" slots"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" slave\n replicates 79074d9fe1f4d59bc6e027c326112094ade7bf93\nS: 2a54c3642936c5b19751d50664811df5f87696a3 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6390\n slots: "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" slots"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" slave\n replicates a970ee79f6939aa6f15dbba55e7cfc32f4de193f\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("OK"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" All nodes agree about slots configuration.\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Check "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("open")]),s._v(" slots"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Check slots coverage"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("OK"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" All "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("16384")]),s._v(" slots covered.\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 进入客户端,-c表示以集群方式启动")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost redis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /usr/local/bin/redis-cli -p 6379 -c")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 测试")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k1 v1\n-"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Redirected to slot "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12706")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" located at "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6381\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:638"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("1")]),s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k2 v2\n-"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Redirected to slot "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("449")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" located at "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6379\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k3 v3\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k4 v4\n-"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Redirected to slot "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8455")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" located at "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6380\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:638"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("0")]),s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k5 v5\n-"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Redirected to slot "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12582")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" located at "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6381\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:638"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("1")]),s._v(">")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" k6 v6\n-"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Redirected to slot "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("325")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" located at "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:6379\nOK\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" dbsize\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("integer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".66.133:637"),n("span",{pre:!0,attrs:{class:"token operator"}},[n("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" \n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br"),n("span",{staticClass:"line-number"},[s._v("56")]),n("br"),n("span",{staticClass:"line-number"},[s._v("57")]),n("br"),n("span",{staticClass:"line-number"},[s._v("58")]),n("br"),n("span",{staticClass:"line-number"},[s._v("59")]),n("br"),n("span",{staticClass:"line-number"},[s._v("60")]),n("br"),n("span",{staticClass:"line-number"},[s._v("61")]),n("br"),n("span",{staticClass:"line-number"},[s._v("62")]),n("br"),n("span",{staticClass:"line-number"},[s._v("63")]),n("br"),n("span",{staticClass:"line-number"},[s._v("64")]),n("br"),n("span",{staticClass:"line-number"},[s._v("65")]),n("br"),n("span",{staticClass:"line-number"},[s._v("66")]),n("br"),n("span",{staticClass:"line-number"},[s._v("67")]),n("br"),n("span",{staticClass:"line-number"},[s._v("68")]),n("br"),n("span",{staticClass:"line-number"},[s._v("69")]),n("br"),n("span",{staticClass:"line-number"},[s._v("70")]),n("br"),n("span",{staticClass:"line-number"},[s._v("71")]),n("br"),n("span",{staticClass:"line-number"},[s._v("72")]),n("br"),n("span",{staticClass:"line-number"},[s._v("73")]),n("br"),n("span",{staticClass:"line-number"},[s._v("74")]),n("br"),n("span",{staticClass:"line-number"},[s._v("75")]),n("br"),n("span",{staticClass:"line-number"},[s._v("76")]),n("br"),n("span",{staticClass:"line-number"},[s._v("77")]),n("br"),n("span",{staticClass:"line-number"},[s._v("78")]),n("br"),n("span",{staticClass:"line-number"},[s._v("79")]),n("br"),n("span",{staticClass:"line-number"},[s._v("80")]),n("br"),n("span",{staticClass:"line-number"},[s._v("81")]),n("br"),n("span",{staticClass:"line-number"},[s._v("82")]),n("br"),n("span",{staticClass:"line-number"},[s._v("83")]),n("br"),n("span",{staticClass:"line-number"},[s._v("84")]),n("br"),n("span",{staticClass:"line-number"},[s._v("85")]),n("br"),n("span",{staticClass:"line-number"},[s._v("86")]),n("br"),n("span",{staticClass:"line-number"},[s._v("87")]),n("br"),n("span",{staticClass:"line-number"},[s._v("88")]),n("br"),n("span",{staticClass:"line-number"},[s._v("89")]),n("br"),n("span",{staticClass:"line-number"},[s._v("90")]),n("br"),n("span",{staticClass:"line-number"},[s._v("91")]),n("br"),n("span",{staticClass:"line-number"},[s._v("92")]),n("br"),n("span",{staticClass:"line-number"},[s._v("93")]),n("br"),n("span",{staticClass:"line-number"},[s._v("94")]),n("br"),n("span",{staticClass:"line-number"},[s._v("95")]),n("br")])]),n("h2",{attrs:{id:"redis-应用"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#redis-应用"}},[s._v("#")]),s._v(" Redis 应用")]),s._v(" "),n("ol",[n("li",[s._v("热点数据缓存")]),s._v(" "),n("li",[s._v("单点登录缓存用户信息")]),s._v(" "),n("li",[s._v("分布式锁")])]),s._v(" "),n("h2",{attrs:{id:"java-操作-redis"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#java-操作-redis"}},[s._v("#")]),s._v(" Java 操作 Redis")]),s._v(" "),n("p",[n("strong",[s._v("Redis 出厂配置,默认只接受本机访问请求。")])]),s._v(" "),n("p",[s._v("如果应用程序与 Redis 服务器不在同一台服务器,需要修改redis.conf。")]),s._v(" "),n("ol",[n("li",[s._v("将 bind 127.0.0.1 注释掉")]),s._v(" "),n("li",[s._v("将 protected-mode yes 改为 protected-mode no")])]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("vi")]),s._v(" /path/to/redis.conf\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("################################## NETWORK #####################################")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# bind 127.0.0.1")]),s._v("\nprotected-mode no\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("h3",{attrs:{id:"jedis"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#jedis"}},[s._v("#")]),s._v(" Jedis")]),s._v(" "),n("p",[n("strong",[s._v("Jedis直连")])]),s._v(" "),n("img",{attrs:{src:a(643)}}),s._v(" "),n("p",[n("strong",[s._v("Jedis连接池")])]),s._v(" "),n("img",{attrs:{src:a(644)}}),s._v(" "),n("p",[n("strong",[s._v("两种方式比较")])]),s._v(" "),n("img",{attrs:{src:a(645)}}),s._v(" "),n("p",[n("strong",[s._v("配置优化")])]),s._v(" "),n("img",{attrs:{src:a(646)}}),s._v(" "),n("img",{attrs:{src:a(647)}}),s._v(" "),n("div",{staticClass:"language-xml line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-xml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("\x3c!-- https://mvnrepository.com/artifact/redis.clients/jedis --\x3e")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("redis.clients"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("jedis"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("3.5.2"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 直连")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Jedis")]),s._v(" jedis "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Jedis")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"192.168.66.133"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 连接池")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JedisPoolConfig")]),s._v(" jedisPoolConfig "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JedisPoolConfig")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\njedisPoolConfig"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("setMaxTotal")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\njedisPoolConfig"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("setMaxWaitMillis")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1000")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JedisPool")]),s._v(" jedisPool "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JedisPool")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("jedisPoolConfig"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"192.168.66.133"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Jedis")]),s._v(" jedis "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("try")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\tjedis "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" jedisPool"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("getResource")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("System")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("out"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("println")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("jedis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ping")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("catch")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Exception")]),s._v(" e"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\te"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("printStackTrace")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("finally")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("jedis "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t\tjedis"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\njedisPool"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 集群")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Set")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HostAndPort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" nodes "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HashSet")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nnodes"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HostAndPort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"192.168.66.133"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nnodes"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HostAndPort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"192.168.66.133"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6380")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nnodes"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("add")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("HostAndPort")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"192.168.66.133"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6381")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JedisCluster")]),s._v(" jedisCluster "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("JedisCluster")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("nodes"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\njedisCluster"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("close")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br")])]),n("h3",{attrs:{id:"redistemplate"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#redistemplate"}},[s._v("#")]),s._v(" RedisTemplate")]),s._v(" "),n("div",{staticClass:"language-xml line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-xml"}},[n("code",[s._v(" "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependencyManagement")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependencies")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.springframework.boot"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("spring-boot-starter-parent"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("2.3.5.RELEASE"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("type")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("pom"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("scope")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("import"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependencies")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.springframework.boot"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("spring-boot-starter-web"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.springframework.boot"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("spring-boot-starter-data-redis"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.springframework.boot"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("spring-boot-starter-test"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("\x3c!-- Redis序列化 --\x3e")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("com.alibaba"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("fastjson"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("1.2.75"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("\x3c!-- Redis要使用连接池,需要引入commons-pool2 --\x3e")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.commons"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("commons-pool2"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br")])]),n("div",{staticClass:"language-yaml line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-yaml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 自动配置类:RedisAutoConfiguration")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置属性:RedisProperties")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spring")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("redis")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 单机配置")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# host: 192.168.66.133")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# port: 6379")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 集群配置")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("cluster")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nodes")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 192.168.66.133"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 192.168.66.133"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6390")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" 192.168.66.133"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6391")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 单机或集群配置连接池,SpringBoot2.X采用Lettuce客户端连接Redis服务端,默认不使用连接池,只有配置以下属性时才使用连接池")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("lettuce")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("shutdown-timeout")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 关闭超时时间")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("pool")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("max-active")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 连接池最大连接数(使用负值表示没有限制)")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("max-idle")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 连接池中的最大空闲连接")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("max-wait")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("30")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 连接池最大阻塞等待时间(使用负值表示没有限制)")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("min-idle")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 连接池中的最小空闲连接")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br")])]),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Configuration")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RedisConfig")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RedisTemplate")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("redisTemplate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RedisConnectionFactory")]),s._v(" redisConnectionFactory"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("UnknownHostException")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RedisTemplate")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("String")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v(" template "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RedisTemplate")]),n("span",{pre:!0,attrs:{class:"token generics"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// key的序列化采用StringRedisSerializer")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("StringRedisSerializer")]),s._v(" stringRedisSerializer "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("StringRedisSerializer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n template"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("setKeySerializer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("stringRedisSerializer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n template"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("setHashKeySerializer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("stringRedisSerializer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// value的序列化采用fastJsonRedisSerializer")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FastJsonRedisSerializer")]),s._v(" fastJsonRedisSerializer "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FastJsonRedisSerializer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n template"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("setValueSerializer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fastJsonRedisSerializer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n template"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("setHashValueSerializer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fastJsonRedisSerializer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n template"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("setConnectionFactory")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("redisConnectionFactory"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" template"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Bean")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("StringRedisTemplate")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("stringRedisTemplate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RedisConnectionFactory")]),s._v(" redisConnectionFactory"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("throws")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("UnknownHostException")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("StringRedisTemplate")]),s._v(" template "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("StringRedisTemplate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// key的序列化采用StringRedisSerializer")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("StringRedisSerializer")]),s._v(" stringRedisSerializer "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("StringRedisSerializer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n template"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("setKeySerializer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("stringRedisSerializer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// value的序列化采用fastJsonRedisSerializer")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FastJsonRedisSerializer")]),s._v(" fastJsonRedisSerializer "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("new")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("FastJsonRedisSerializer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Object")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n template"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("setValueSerializer")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("fastJsonRedisSerializer"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n template"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("setConnectionFactory")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("redisConnectionFactory"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("return")]),s._v(" template"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br")])]),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 使 @Autowired 等注解标记的类能实例化到IOC容器中,否则会报NullPointerExecption")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@RunWith")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SpringRunner")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@SpringBootTest")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("class")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("TestRedis")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Autowired")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("private")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("RedisTemplate")]),s._v(" redisTemplate"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[s._v("@Test")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("test1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 数据类型")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.opsForValue() 字符串")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.opsForList() 列表")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.opsForSet() 无序列表")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.opsForZSet() 有序列表")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.opsForHash() 哈希表")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.opsForHyperLogLog() HyperLogLog")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.opsForGeo() 地理位置")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// key操作")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.keys(pattern)")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.hasKey(key)")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.delete(key)")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 事务操作")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.watch(key)")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.multi()")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.exec()")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.discard()")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// redisTemplate.expire()")]),s._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 字符串")]),s._v("\n redisTemplate"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("opsForValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("set")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"k1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"v1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n redisTemplate"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("opsForValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("set")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"k2"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"v2"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n redisTemplate"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("opsForValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("set")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"k3"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"v3"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n redisTemplate"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("opsForValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("set")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"k4"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"v4"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n redisTemplate"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("opsForValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("set")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"k5"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"v5"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n redisTemplate"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("opsForValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("set")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"k6"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"v6"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n redisTemplate"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("opsForValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("set")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"k7"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"v7"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n redisTemplate"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("opsForValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("set")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"k8"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"v8"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n redisTemplate"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("opsForValue")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("set")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"k9"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"v9"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br")])])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/13.1d0acdc1.js b/assets/js/13.1d0acdc1.js new file mode 100644 index 00000000..4654fc62 --- /dev/null +++ b/assets/js/13.1d0acdc1.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{623:function(t,v,s){t.exports=s.p+"assets/img/20240317155509.747d577d.png"},624:function(t,v,s){t.exports=s.p+"assets/img/20240317155644.844f0916.png"},625:function(t,v,s){t.exports=s.p+"assets/img/20240317160606.9173e2fd.png"},626:function(t,v,s){t.exports=s.p+"assets/img/20240317161126.237e07d5.png"},627:function(t,v,s){t.exports=s.p+"assets/img/20240623113624.ff9f777d.jpg"},730:function(t,v,s){"use strict";s.r(v);var _=s(7),a=Object(_.a)({},(function(){var t=this,v=t.$createElement,_=t._self._c||v;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h2",{attrs:{id:"mkdir-新建文件夹"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#mkdir-新建文件夹"}},[t._v("#")]),t._v(" mkdir 新建文件夹")]),t._v(" "),_("p",[t._v("格式:"),_("code",[t._v("mkdir [选项] 目录")])]),t._v(" "),_("p",[t._v("例子:"),_("code",[t._v("mkdir -p /path/to/directory")]),t._v(",递归创建/path/to/directory")]),t._v(" "),_("h2",{attrs:{id:"cd-切换目录"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#cd-切换目录"}},[t._v("#")]),t._v(" cd 切换目录")]),t._v(" "),_("p",[t._v("格式: "),_("code",[t._v("cd 目录")])]),t._v(" "),_("p",[t._v("例子: "),_("code",[t._v("cd ..")]),t._v(" ,进入上一级父目录")]),t._v(" "),_("h2",{attrs:{id:"pwd-显示当前路径"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#pwd-显示当前路径"}},[t._v("#")]),t._v(" pwd 显示当前路径")]),t._v(" "),_("p",[t._v("格式: "),_("code",[t._v("pwd [选项]")])]),t._v(" "),_("p",[t._v("例子: "),_("code",[t._v("pwd")]),t._v(" ,查看当前所在目录")]),t._v(" "),_("h2",{attrs:{id:"ls-列出文件"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#ls-列出文件"}},[t._v("#")]),t._v(" ls 列出文件")]),t._v(" "),_("p",[t._v("ll 是 ls -l 的别名,参数 -l 成为长格式,列出当前文件夹下的详细内容。")]),t._v(" "),_("p",[t._v("从左到右依次是:文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后访问(修改)时间等。")]),t._v(" "),_("p",[t._v("第一部分是文件类型:- 普通文件 , d 目录文件,I 链接文件,p 管理文件, b 块设备文件, c 文件, s 套接字文件")]),t._v(" "),_("p",[_("img",{attrs:{src:s(623),alt:""}})]),t._v(" "),_("p",[t._v("第二部分是权限模式:r表示读取(read)、w表示写入(write),x表示执行(execute)")]),t._v(" "),_("p",[_("img",{attrs:{src:s(624),alt:""}})]),t._v(" "),_("p",[_("img",{attrs:{src:s(625),alt:""}})]),t._v(" "),_("p",[_("img",{attrs:{src:s(626),alt:""}})]),t._v(" "),_("p",[t._v("ls -a, a为all的首字母缩写,该命令可以列出系统的隐藏文件,隐藏文件以“.”开头。")]),t._v(" "),_("h2",{attrs:{id:"find-查找文件"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#find-查找文件"}},[t._v("#")]),t._v(" find 查找文件")]),t._v(" "),_("p",[t._v("find 命令在指定目录查找文件。语法:")]),t._v(" "),_("div",{staticClass:"language-shell line-numbers-mode"},[_("pre",{pre:!0,attrs:{class:"language-shell"}},[_("code",[_("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),t._v(" path -option "),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("-print"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("-exec -ok command"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),_("div",{staticClass:"line-numbers-wrapper"},[_("span",{staticClass:"line-number"},[t._v("1")]),_("br")])]),_("ul",[_("li",[t._v("path 表示查找目录的范围,即在哪里找文件,可以用Linux默认目录表示,例如:. (当前目录),~ (家目录),/ (根目录)。")]),t._v(" "),_("li",[t._v("option 表示查找规则条件,例如:按文件名(-name)查找文件。")]),t._v(" "),_("li",[t._v("print 表示把查找结果标准输出,一般为默认选项,可以不写。")]),t._v(" "),_("li",[t._v("exec 和 ok 可以对查找结果做进一步的指令操作,它们两者的不同在于 ok 在操作前询问用户,而 exec 不会。")]),t._v(" "),_("li",[t._v('"{} ;"为固定格式,它们之间有空格。')])]),t._v(" "),_("p",[t._v("按照文件名(-name)查找文件")]),t._v(" "),_("div",{staticClass:"language-shell line-numbers-mode"},[_("pre",{pre:!0,attrs:{class:"language-shell"}},[_("code",[_("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 查找家目录中扩展名为“.log”的文件")]),t._v("\n"),_("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),t._v(" ~ -name "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v('"*.log"')]),t._v("\n\n"),_("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 查找 /etc/ 目录下以c开头或以conf结尾的文件")]),t._v("\n"),_("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),t._v(" /etc/ -name "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v('"c*"')]),t._v(" -o -name "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v('"*conf"')]),t._v("\n")])]),t._v(" "),_("div",{staticClass:"line-numbers-wrapper"},[_("span",{staticClass:"line-number"},[t._v("1")]),_("br"),_("span",{staticClass:"line-number"},[t._v("2")]),_("br"),_("span",{staticClass:"line-number"},[t._v("3")]),_("br"),_("span",{staticClass:"line-number"},[t._v("4")]),_("br"),_("span",{staticClass:"line-number"},[t._v("5")]),_("br")])]),_("p",[t._v("按文件大小(-size)查找文件")]),t._v(" "),_("div",{staticClass:"language-shell line-numbers-mode"},[_("pre",{pre:!0,attrs:{class:"language-shell"}},[_("code",[_("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 查找/tmp目录下小于512KB的文件")]),t._v("\n"),_("span",{pre:!0,attrs:{class:"token function"}},[t._v("find")]),t._v(" /tmp -size -512k\n")])]),t._v(" "),_("div",{staticClass:"line-numbers-wrapper"},[_("span",{staticClass:"line-number"},[t._v("1")]),_("br"),_("span",{staticClass:"line-number"},[t._v("2")]),_("br")])]),_("p",[t._v("按时间戳(-atime/-mtime/-ctime)查找文件")]),t._v(" "),_("p",[t._v("atime:access time,通常为最后读文件的时间;")]),t._v(" "),_("p",[t._v("mtime:modified time,通常为最后写文件的时间;")]),t._v(" "),_("p",[t._v("ctime:change time,通常为最后改变文件权限属性的时间。")]),t._v(" "),_("p",[t._v("时间戳参数还可以用分钟为单位,-atime/-mtime/-ctime对应-amin/-mmin/-cmin")]),t._v(" "),_("p",[t._v("可以通过 stat 命令查看文件的信息")]),t._v(" "),_("div",{staticClass:"language-shell line-numbers-mode"},[_("pre",{pre:!0,attrs:{class:"language-shell"}},[_("code",[_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("root@localhost0131 ~"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),_("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# stat /etc/ssh/sshd_config ")]),t._v("\n File: ‘/etc/ssh/sshd_config’\n Size: "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("3907")]),t._v(" Blocks: "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(" IO Block: "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("4096")]),t._v(" regular "),_("span",{pre:!0,attrs:{class:"token function"}},[t._v("file")]),t._v("\nDevice: fd00h/64768d Inode: "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("354805")]),t._v(" Links: "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\nAccess: "),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("0600/-rw-------"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" Uid: "),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("/ root"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" Gid: "),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("/ root"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nContext: system_u:object_r:etc_t:s0\nAccess: "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("2024")]),t._v("-06-23 09:15:10.048000526 +0800\nModify: "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-08-09 09:40:39.000000000 +0800\nChange: "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("2021")]),t._v("-11-28 "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":45:26.638590177 +0800\n Birth: -\n")])]),t._v(" "),_("div",{staticClass:"line-numbers-wrapper"},[_("span",{staticClass:"line-number"},[t._v("1")]),_("br"),_("span",{staticClass:"line-number"},[t._v("2")]),_("br"),_("span",{staticClass:"line-number"},[t._v("3")]),_("br"),_("span",{staticClass:"line-number"},[t._v("4")]),_("br"),_("span",{staticClass:"line-number"},[t._v("5")]),_("br"),_("span",{staticClass:"line-number"},[t._v("6")]),_("br"),_("span",{staticClass:"line-number"},[t._v("7")]),_("br"),_("span",{staticClass:"line-number"},[t._v("8")]),_("br"),_("span",{staticClass:"line-number"},[t._v("9")]),_("br"),_("span",{staticClass:"line-number"},[t._v("10")]),_("br")])]),_("h2",{attrs:{id:"touch-新建空文件"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#touch-新建空文件"}},[t._v("#")]),t._v(" touch 新建空文件")]),t._v(" "),_("p",[t._v("touch命令可以新建空文件,更新文件修改时间")]),t._v(" "),_("p",[t._v("格式: "),_("code",[t._v("touch [选项] 文件")])]),t._v(" "),_("p",[t._v("例子: "),_("code",[t._v("touch foo.txt")]),t._v(" ,创建foo.txt空文件")]),t._v(" "),_("h2",{attrs:{id:"mv-剪贴或重命名文件或文件夹"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#mv-剪贴或重命名文件或文件夹"}},[t._v("#")]),t._v(" mv 剪贴或重命名文件或文件夹")]),t._v(" "),_("p",[t._v("格式: "),_("code",[t._v("mv [选项] 源文件或目录 目标文件或目录")])]),t._v(" "),_("p",[t._v("例子: "),_("code",[t._v("mv foo.txt foo.txt.backup")]),t._v(" ,将文件foo.txt重命名为foo.txt.backup")]),t._v(" "),_("p",[t._v("​ "),_("code",[t._v("mv foo.txt backup")]),t._v(" ,将文件foo.txt移动到目录backup中")]),t._v(" "),_("h2",{attrs:{id:"cp-复制文件或文件夹"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#cp-复制文件或文件夹"}},[t._v("#")]),t._v(" cp 复制文件或文件夹")]),t._v(" "),_("p",[t._v("格式: "),_("code",[t._v("cp [选项] 源文件或目录 目标文件或目录")])]),t._v(" "),_("p",[t._v("例子: "),_("code",[t._v("cp foo.txt foo.txt.backup")]),t._v(" ,将文件foo.txt拷贝一份副本foo.txt.backup")]),t._v(" "),_("p",[t._v("​ "),_("code",[t._v("cp foo.txt backup")]),t._v(" ,将文件foo.txt复制到目录backup中")]),t._v(" "),_("h2",{attrs:{id:"rm-删除文件或文件夹"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#rm-删除文件或文件夹"}},[t._v("#")]),t._v(" rm 删除文件或文件夹")]),t._v(" "),_("p",[t._v("格式: "),_("code",[t._v("rm [选项] 文件或目录")])]),t._v(" "),_("p",[t._v("例子: "),_("code",[t._v("rm foo.txt")]),t._v(" ,删除文件foo.txt")]),t._v(" "),_("p",[t._v("​ "),_("code",[t._v("rm -rf foo")]),t._v(" ,将文件夹foo及其子文件夹中所有内容删除,其不用一一确认")]),t._v(" "),_("h2",{attrs:{id:"cat-查看文件全部内容"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#cat-查看文件全部内容"}},[t._v("#")]),t._v(" cat 查看文件全部内容")]),t._v(" "),_("p",[t._v("cat将一个文件的内容发送到标准输出设备,例如显示屏。")]),t._v(" "),_("p",[t._v("格式: "),_("code",[t._v("cat [选项] 文件")])]),t._v(" "),_("p",[t._v("例子: "),_("code",[t._v("cat /etc/ssh/sshd_config")]),t._v(" ,显示文件sshd_config的内容")]),t._v(" "),_("p",[t._v("​ "),_("code",[t._v("cat -n /etc/ssh/sshd_config")]),t._v(" ,显示文件sshd_config的内容,同时在文件每行前进行编号")]),t._v(" "),_("h2",{attrs:{id:"more-与-less-分屏查看长文件内容"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#more-与-less-分屏查看长文件内容"}},[t._v("#")]),t._v(" more 与 less 分屏查看长文件内容")]),t._v(" "),_("p",[t._v("more 命令从前向后读取文件。")]),t._v(" "),_("p",[t._v("格式: "),_("code",[t._v("more [选项] 文件")])]),t._v(" "),_("p",[t._v("例子: "),_("code",[t._v("more /etc/ssh/sshd_config")])]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",{staticStyle:{"text-align":"left"}},[t._v("按键")]),t._v(" "),_("th",{staticStyle:{"text-align":"left"}},[t._v("用途")])])]),t._v(" "),_("tbody",[_("tr",[_("td",{staticStyle:{"text-align":"left"}},[t._v("按【Space】空格键")]),t._v(" "),_("td",{staticStyle:{"text-align":"left"}},[t._v("向下翻页")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"left"}},[t._v("按【B】键")]),t._v(" "),_("td",{staticStyle:{"text-align":"left"}},[t._v("向上翻页")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"left"}},[t._v("按【Q 】键 或 【Ctrl+C】组合键")]),t._v(" "),_("td",{staticStyle:{"text-align":"left"}},[t._v("退出当前界面")])])])]),t._v(" "),_("p",[t._v("less是more命令的改良版,对more的交互快捷键是兼容的,支持【PgUp】和【PgDn】逐行阅读。")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",{staticStyle:{"text-align":"left"}},[t._v("按键")]),t._v(" "),_("th",{staticStyle:{"text-align":"left"}},[t._v("用途")])])]),t._v(" "),_("tbody",[_("tr",[_("td",{staticStyle:{"text-align":"left"}},[t._v("按【PgUp】键")]),t._v(" "),_("td",{staticStyle:{"text-align":"left"}},[t._v("向上一行")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"left"}},[t._v("按【PgDn】键")]),t._v(" "),_("td",{staticStyle:{"text-align":"left"}},[t._v("向下一行")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"left"}},[t._v("按【Enter】键")]),t._v(" "),_("td",{staticStyle:{"text-align":"left"}},[t._v("向下一行")])])])]),t._v(" "),_("h2",{attrs:{id:"head-与-tail-查看文件指定内容"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#head-与-tail-查看文件指定内容"}},[t._v("#")]),t._v(" head 与 tail 查看文件指定内容")]),t._v(" "),_("p",[t._v("head 命令后直接跟文件名称默认会显示文件的前10行,如果想指定查看的行数可以使用参数-n。")]),t._v(" "),_("p",[t._v("tail 命令,查看文件的后几行。-f 参数可以用来动态查看文件的最后几行,一般用于监控日志文件或实时文件,占用提示符窗口而不会退出。")]),t._v(" "),_("div",{staticClass:"language-shell line-numbers-mode"},[_("pre",{pre:!0,attrs:{class:"language-shell"}},[_("code",[_("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),t._v(" nohub.out\t\t"),_("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 查看文件nohub.out的前10行内容")]),t._v("\n"),_("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),t._v(" -20 nohub.out\t"),_("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 查看文件nohub.out的前20行内容")]),t._v("\n"),_("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" -20 nohub.out\t"),_("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 查看文件nohub.out的后20行内容")]),t._v("\n"),_("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" -n "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" -f nohub.out\t"),_("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 动态查看文件nohub.out的后20行内容")]),t._v("\n")])]),t._v(" "),_("div",{staticClass:"line-numbers-wrapper"},[_("span",{staticClass:"line-number"},[t._v("1")]),_("br"),_("span",{staticClass:"line-number"},[t._v("2")]),_("br"),_("span",{staticClass:"line-number"},[t._v("3")]),_("br"),_("span",{staticClass:"line-number"},[t._v("4")]),_("br")])]),_("h2",{attrs:{id:"vi-与-vim-编辑文件"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#vi-与-vim-编辑文件"}},[t._v("#")]),t._v(" vi 与 vim 编辑文件")]),t._v(" "),_("p",[t._v("vi 有三种基本工作模式:命令模式、插入模式和末行模式。")]),t._v(" "),_("p",[_("img",{attrs:{src:s(627),alt:""}})]),t._v(" "),_("p",[t._v("插入模式的常用快捷键:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("快捷键")]),t._v(" "),_("th",[t._v("功能")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("i")]),t._v(" "),_("td",[t._v("在光标前插入")])]),t._v(" "),_("tr",[_("td",[t._v("a")]),t._v(" "),_("td",[t._v("在光标后插入")])]),t._v(" "),_("tr",[_("td",[t._v("I")]),t._v(" "),_("td",[t._v("在光标所在行行首插入")])]),t._v(" "),_("tr",[_("td",[t._v("A")]),t._v(" "),_("td",[t._v("在光标所在行行尾插入")])]),t._v(" "),_("tr",[_("td",[t._v("o")]),t._v(" "),_("td",[t._v("在当前行的下面另起一行,并变为插入模式")])]),t._v(" "),_("tr",[_("td",[t._v("O")]),t._v(" "),_("td",[t._v("在当前行的上面另起一行,并变为插入模式")])])])]),t._v(" "),_("p",[t._v("插入模式的常用命令:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("命令")]),t._v(" "),_("th",[t._v("作用")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("x")]),t._v(" "),_("td",[t._v("删除光标所在处字符")])]),t._v(" "),_("tr",[_("td",[t._v("nx")]),t._v(" "),_("td",[t._v("删除光标所在处后n个字符")])]),t._v(" "),_("tr",[_("td",[t._v("dd")]),t._v(" "),_("td",[t._v("剪切当前行/删除光标所在行")])]),t._v(" "),_("tr",[_("td",[t._v("ndd")]),t._v(" "),_("td",[t._v("剪切当前行以下n行/删除光标所在行后n行")])]),t._v(" "),_("tr",[_("td",[t._v("D")]),t._v(" "),_("td",[t._v("删除光标所在处到行尾的内容")])]),t._v(" "),_("tr",[_("td",[t._v("dG")]),t._v(" "),_("td",[t._v("删除光标所在行到文件末尾的内容")])]),t._v(" "),_("tr",[_("td",[t._v(":n1,n2d")]),t._v(" "),_("td",[t._v("删除指定范围的行")])]),t._v(" "),_("tr",[_("td",[t._v("yy")]),t._v(" "),_("td",[t._v("复制当前行")])]),t._v(" "),_("tr",[_("td",[t._v("nyy")]),t._v(" "),_("td",[t._v("复制当前行以下n行")])]),t._v(" "),_("tr",[_("td",[t._v("yw")]),t._v(" "),_("td",[t._v("复制单词")])]),t._v(" "),_("tr",[_("td",[t._v("y$")]),t._v(" "),_("td",[t._v("复制光标到行尾")])]),t._v(" "),_("tr",[_("td",[t._v("y^")]),t._v(" "),_("td",[t._v("复制行首到光标")])]),t._v(" "),_("tr",[_("td",[t._v("p")]),t._v(" "),_("td",[t._v("粘贴在光标所在行下")])]),t._v(" "),_("tr",[_("td",[t._v("P")]),t._v(" "),_("td",[t._v("粘贴在光标所在行上")])]),t._v(" "),_("tr",[_("td",[t._v("fC")]),t._v(" "),_("td",[t._v("快速移动到字符C")])]),t._v(" "),_("tr",[_("td",[t._v("rC")]),t._v(" "),_("td",[t._v("替换光标所在处字符为字母C")])]),t._v(" "),_("tr",[_("td",[t._v("R")]),t._v(" "),_("td",[t._v("从光标所在处开始替换字符,按Esc结束")])]),t._v(" "),_("tr",[_("td",[t._v("u")]),t._v(" "),_("td",[t._v("取消上一步操作")])])])]),t._v(" "),_("p",[t._v("末行模式的常用命令:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("命令")]),t._v(" "),_("th",[t._v("功能")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v(":set nu")]),t._v(" "),_("td",[t._v("设置行号")])]),t._v(" "),_("tr",[_("td",[t._v(":set nonu")]),t._v(" "),_("td",[t._v("取消行号")])]),t._v(" "),_("tr",[_("td",[t._v(":wq!")]),t._v(" "),_("td",[t._v("保存退出。"),_("code",[t._v(":wq")]),t._v(" 是 write (存盘) 和 quit (退出) 的组合命令。")])]),t._v(" "),_("tr",[_("td",[t._v(":q!")]),t._v(" "),_("td",[t._v("不保存强制退出")])])])]),t._v(" "),_("p",[t._v("在末行模式中,值得一提的命令是查找与替换。")]),t._v(" "),_("p",[t._v("查找命令以 “/” 字符开始,后接被查找的字符,与 less 命令的查找快捷键相同。")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("命令")]),t._v(" "),_("th",[t._v("功能")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("n")]),t._v(" "),_("td",[t._v("跳转到下一个匹配字符串")])]),t._v(" "),_("tr",[_("td",[t._v("N")]),t._v(" "),_("td",[t._v("跳转到上一个匹配字符串")])])])]),t._v(" "),_("p",[t._v("例如查找字母t,输入“/t”,屏幕中就会反白显示查找的内容。")]),t._v(" "),_("p",[t._v("替换命令由三个反斜杠(///)连接而成,第一个反斜杠之前表示替换的范围,第一个和第二个反斜杠之间表示需要被替换的字符串,第二个和第三个反斜杠之间表示替换成的字符串。")]),t._v(" "),_("p",[t._v("例如:"),_("code",[t._v(":20,30s/set/SET/g")]),t._v(" 表示替换20~30行的所有set为SET,参数g表示全局替换,如果不加参数g,表示只替换本行的第一个匹配的字符串。")]),t._v(" "),_("p",[t._v("常用的定位命令:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("命令")]),t._v(" "),_("th",[t._v("功能")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("gg")]),t._v(" "),_("td",[t._v("跳到第一行")])]),t._v(" "),_("tr",[_("td",[t._v("G")]),t._v(" "),_("td",[t._v("跳到最后一行")])]),t._v(" "),_("tr",[_("td",[t._v("nG")]),t._v(" "),_("td",[t._v("跳到第n行")])]),t._v(" "),_("tr",[_("td",[t._v(":n")]),t._v(" "),_("td",[t._v("跳到第n行")])]),t._v(" "),_("tr",[_("td",[t._v("0")]),t._v(" "),_("td",[t._v("移至光标所在行行首")])]),t._v(" "),_("tr",[_("td",[t._v("$")]),t._v(" "),_("td",[t._v("移至光标所在行行尾")])])])])])}),[],!1,null,null,null);v.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/18.c95591df.js b/assets/js/18.c95591df.js new file mode 100644 index 00000000..507ac9f9 --- /dev/null +++ b/assets/js/18.c95591df.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{532:function(s,t,e){s.exports=e.p+"assets/img/20240817100020.c77e2230.jpg"},533:function(s,t,e){s.exports=e.p+"assets/img/20240818183607.a20fa99f.jpg"},534:function(s,t,e){s.exports=e.p+"assets/img/20240825175858.2af40ba2.jpg"},682:function(s,t,e){"use strict";e.r(t);var n=e(7),a=Object(n.a)({},(function(){var s=this,t=s.$createElement,n=s._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("p",[n("a",{attrs:{href:"https://www.ansible.com/",target:"_blank",rel:"noopener noreferrer"}},[s._v("Ansible"),n("OutboundLink")],1),s._v("是一个基于Python开发的自动化运维工具,可以用来配置系统、部署软件和编排其他系统任务。Ansible没有客户端,底层通信依赖于系统软件,Linux系统下基于OpenSSH通信,Windows系统下基于PowerShell,管理端必须是Linux。Ansible通过SSH连接客户端执行任务。")]),s._v(" "),n("h2",{attrs:{id:"ansible的三大组件"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ansible的三大组件"}},[s._v("#")]),s._v(" Ansible的三大组件")]),s._v(" "),n("p",[s._v("Ansible automates the management of remote systems and controls their desired state.")]),s._v(" "),n("p",[n("img",{attrs:{src:e(532),alt:""}})]),s._v(" "),n("p",[s._v("As shown in the preceding figure, most Ansible environments have three main components:")]),s._v(" "),n("ul",[n("li",[n("p",[s._v("Control node")]),s._v(" "),n("p",[s._v("A system on which Ansible is installed. You run Ansible commands such as "),n("code",[s._v("ansible")]),s._v(" or "),n("code",[s._v("ansible-inventory")]),s._v(" on a control node.")])]),s._v(" "),n("li",[n("p",[s._v("Inventory")]),s._v(" "),n("p",[s._v("A list of managed nodes that are logically organized. You create an inventory on the control node to describe host deployments to Ansible.")])]),s._v(" "),n("li",[n("p",[s._v("Managed node")]),s._v(" "),n("p",[s._v("A remote system, or host, that Ansible controls.")])])]),s._v(" "),n("h2",{attrs:{id:"ansible的安装部署"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ansible的安装部署"}},[s._v("#")]),s._v(" Ansible的安装部署")]),s._v(" "),n("h3",{attrs:{id:"control-node-requirements"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#control-node-requirements"}},[s._v("#")]),s._v(" Control node requirements")]),s._v(" "),n("p",[s._v("For your "),n("em",[s._v("control")]),s._v(" node (the machine that runs Ansible), you can use nearly any UNIX-like machine with Python installed. This includes Red Hat, Debian, Ubuntu, macOS, BSDs, and Windows under a "),n("a",{attrs:{href:"https://docs.microsoft.com/en-us/windows/wsl/about",target:"_blank",rel:"noopener noreferrer"}},[s._v("Windows Subsystem for Linux (WSL) distribution"),n("OutboundLink")],1),s._v(". Windows without WSL is not natively supported as a control node; see "),n("a",{attrs:{href:"http://blog.rolpdog.com/2020/03/why-no-ansible-controller-for-windows.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("Matt Davis’ blog post"),n("OutboundLink")],1),s._v(" for more information.")]),s._v(" "),n("h3",{attrs:{id:"managed-node-requirements"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#managed-node-requirements"}},[s._v("#")]),s._v(" Managed node requirements")]),s._v(" "),n("p",[s._v("The "),n("em",[s._v("managed")]),s._v(" node (the machine that Ansible is managing) does not require Ansible to be installed, but requires Python to run Ansible-generated Python code. The managed node also needs a user account that can connect through SSH to the node with an interactive POSIX shell.")]),s._v(" "),n("p",[s._v("以下是在基于Red Hat的系统(如CentOS和Fedora)中使用yum安装Ansible的步骤:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# epel-release的主要用途是提供一个额外的软件源,用于安装那些在官方软件源中不可用或难以找到的软件包。EPEL(Extra Packages for Enterprise Linux)是一个由Fedora社区创建的项目,旨在为RHEL(Red Hat Enterprise Linux)及其衍生版本(如CentOS、Scientific Linux等)提供高质量的软件包。通过安装epel-release软件包,用户实际上是在他们的系统中添加了一个第三方的yum源,这个源提供了比官方rpm仓库更丰富的软件包资源。这在官方源中软件包不足或缺少某些特定软件时非常有用,避免了用户自行编译软件的繁琐过程。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装epel-release源后可找到并安装ansible")]),s._v("\nyum -y "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" epel-release\nyum -y "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" ansible\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br")])]),n("p",[s._v("验证安装结果:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ansible --version\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# https://docs.ansible.com/ansible/2.9/index.html")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost0141 ~"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ansible --version")]),s._v("\nansible "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2.9")]),s._v(".27\n config "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("file")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" /etc/ansible/ansible.cfg\n configured module search path "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("u"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'/root/.ansible/plugins/modules'")]),s._v(", u"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'/usr/share/ansible/plugins/modules'")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n ansible python module location "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" /usr/lib/python2.7/site-packages/ansible\n executable location "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" /usr/bin/ansible\n python version "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2.7")]),s._v(".5 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("default, Nov "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("14")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2023")]),s._v(", "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("16")]),s._v(":14:06"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("GCC "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4.8")]),s._v(".5 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("20150623")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("Red Hat "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4.8")]),s._v(".5-44"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br")])]),n("p",[s._v("其他安装方式:"),n("a",{attrs:{href:"https://docs.ansible.com/ansible/latest/installation_guide/index.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.ansible.com/ansible/latest/installation_guide/index.html"),n("OutboundLink")],1)]),s._v(" "),n("h2",{attrs:{id:"ansible的目录结构"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ansible的目录结构"}},[s._v("#")]),s._v(" Ansible的目录结构")]),s._v(" "),n("p",[s._v("可以通过以下命令获取ansible所有文件存放目录:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -ql ansible\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("该命令输出内容较多,大致分为如下几类:")]),s._v(" "),n("ol",[n("li",[s._v("配置文件目录 :/etc/ansible/,主要功能为:Inventory主机信息配置、Ansible工具功能配置等。所有Ansible的配置均存放在该目录下,运维日常的所有配置类操作也均基于此目录进行。")]),s._v(" "),n("li",[s._v("执行文件目录 :/usr/bin/,主要功能为:Ansible系列命令默认存放目录。Ansible所有可执行文件均存放在该目录下。")]),s._v(" "),n("li",[s._v("Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/,Ansible所有lib库文件和模块文件也均存放于该目录下。")]),s._v(" "),n("li",[s._v("Help文档目录 :/usr/share/doc/ansible-X.X.X/")]),s._v(" "),n("li",[s._v("Man文档目录 :/usr/share/man/man1/")])]),s._v(" "),n("p",[n("img",{attrs:{src:e(533),alt:""}})]),s._v(" "),n("h2",{attrs:{id:"ansible的配置文件"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ansible的配置文件"}},[s._v("#")]),s._v(" Ansible的配置文件")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://docs.ansible.com/ansible/latest/reference_appendices/config.html#ansible-configuration-settings-locations",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.ansible.com/ansible/latest/reference_appendices/config.html#ansible-configuration-settings-locations"),n("OutboundLink")],1)]),s._v(" "),n("p",[s._v("Ansible的配置文件是:"),n("code",[s._v("/etc/ansible/ansible.cfg")]),s._v("。")]),s._v(" "),n("p",[s._v("ansible.cfg可以存放于多个地方,Ansible读取配置文件的顺序依次是:")]),s._v(" "),n("ul",[n("li",[n("code",[s._v("ANSIBLE_CONFIG")]),s._v(" (environment variable if set)")]),s._v(" "),n("li",[n("code",[s._v("ansible.cfg")]),s._v(" (in the current directory)")]),s._v(" "),n("li",[n("code",[s._v("~/.ansible.cfg")]),s._v(" (in the home directory)")]),s._v(" "),n("li",[n("code",[s._v("/etc/ansible/ansible.cfg")])])]),s._v(" "),n("p",[s._v("先找到哪个就使用哪个的配置。其ansible.cfg配置的所有内容均可在命令行通过参数的形式传递或定义在Playbooks中。")]),s._v(" "),n("div",{staticClass:"language-ini line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-ini"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# config file for ansible -- https://ansible.com/")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ===============================================")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# nearly all parameters can be overridden in ansible-playbook")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# or with command line flags. ansible will read ANSIBLE_CONFIG,")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ansible.cfg in the current working directory, .ansible.cfg in")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# the home directory or /etc/ansible/ansible.cfg, whichever it")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# finds first")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[s._v("defaults")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")])]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# some basic default values...")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#inventory = /etc/ansible/hosts\t\t# 定义Inventory")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#library = /usr/share/my_modules/\t# 自定义lib库存放目录")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#module_utils = /usr/share/my_module_utils/")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#remote_tmp = ~/.ansible/tmp\t# 临时文件远程主机存放目录")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#local_tmp = ~/.ansible/tmp\t# 临时文件本地存放目录")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#plugin_filters_cfg = /etc/ansible/plugin_filters.yml")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#forks = 5\t\t# 默认开启的并发数")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#poll_interval = 15\t# 默认轮询时间间隔")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#sudo_user = root\t# 默认sudo用户")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#ask_sudo_pass = True\t# 是否需要sudo密码")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#ask_pass = True\t# 是否需要密码")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#transport = smart")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#remote_port = 22")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#module_lang = C")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#module_set_locale = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# plays will gather facts by default, which contain information about")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# the remote system.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# smart - gather by default, but don't regather if already gathered")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# implicit - gather by default, turn off with gather_facts: False")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# explicit - do not gather by default, must say gather_facts: True")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#gathering = implicit")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# This only affects the gathering done by a play's gather_facts directive,")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# by default gathering retrieves all facts subsets")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# all - gather all subsets")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# network - gather min and network facts")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# hardware - gather hardware facts (longest facts to retrieve)")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# virtual - gather min and virtual facts")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# facter - import facts from facter")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ohai - import facts from ohai")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# You can combine them using comma (ex: network,virtual)")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# You can negate them using ! (ex: !hardware,!facter,!ohai)")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# A minimal set of facts is always gathered.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#gather_subset = all")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# some hardware related facts are collected")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# with a maximum timeout of 10 seconds. This")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# option lets you increase or decrease that")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# timeout to something more suitable for the")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# environment.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# gather_timeout = 10")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Ansible facts are available inside the ansible_facts.* dictionary")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# namespace. This setting maintains the behaviour which was the default prior")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# to 2.5, duplicating these variables into the main namespace, each with a")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# prefix of 'ansible_'.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# This variable is set to True by default for backwards compatibility. It")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# will be changed to a default of 'False' in a future release.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ansible_facts.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# inject_facts_as_vars = True")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# additional paths to search for roles in, colon separated")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#roles_path = /etc/ansible/roles\t# 默认下载的Roles存放的目录")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# uncomment this to disable SSH key host checking")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#host_key_checking = False\t# 首次连接是否需要检查key认证")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# change the default callback, you can only have one 'stdout' type enabled at a time.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#stdout_callback = skippy")]),s._v("\n\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("## Ansible ships with some plugins that require whitelisting,")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("## this is done to avoid running all of a type by default.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("## These setting lists those that you want enabled for your system.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("## Custom plugins should not need this unless plugin author specifies it.")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# enable callback plugins, they can output to stdout but cannot be 'stdout' type.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#callback_whitelist = timer, mail")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# Determine whether includes in tasks and handlers are "static" by')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# default. As of 2.0, includes are dynamic by default. Setting these")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# values to True will make includes behave more like they did in the")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 1.x versions.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#task_includes_static = False")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#handler_includes_static = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Controls if a missing handler for a notification event is an error or a warning")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#error_on_missing_handler = True")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# change this for alternative sudo implementations")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#sudo_exe = sudo")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# What flags to pass to sudo")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# WARNING: leaving out the defaults might create unexpected behaviours")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#sudo_flags = -H -S -n")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# SSH timeout")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#timeout = 10\t# 默认超时时间")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# default user to use for playbooks if user is not specified")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# (/usr/bin/ansible will use current user as default)")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#remote_user = root")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# logging is off by default unless this path is defined")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if so defined, consider logrotate")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#log_path = /var/log/ansible.log\t# 执行日志存放目录")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# default module name for /usr/bin/ansible")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#module_name = command\t# 默认执行的模块")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# use this shell for commands executed under sudo")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# you may need to change this to bin/bash in rare instances")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if sudo is constrained")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#executable = /bin/sh")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if inventory variables overlap, does the higher precedence one win")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# or are hash values merged together? The default is 'replace' but")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# this can also be set to 'merge'.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#hash_behaviour = replace")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# by default, variables from roles will be visible in the global variable")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# scope. To prevent this, the following option can be enabled, and only")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# tasks and handlers within the role will see the variables there")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#private_role_vars = yes")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# list any Jinja2 extensions to enable here:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#jinja2_extensions = jinja2.ext.do,jinja2.ext.i18n")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if set, always use this private key file for authentication, same as")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if passing --private-key to ansible or ansible-playbook")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#private_key_file = /path/to/file")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# If set, configures the path to the Vault password file as an alternative to")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# specifying --vault-password-file on the command line.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#vault_password_file = /path/to/vault_password_file")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# format of string {{ ansible_managed }} available within Jinja2")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# templates indicates to users editing templates files will be replaced.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# replacing {file}, {host} and {uid} and strftime codes with proper values.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# {file}, {host}, {uid}, and the timestamp can all interfere with idempotence")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# in some situations so the default is a static string:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#ansible_managed = Ansible managed")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# by default, ansible-playbook will display "Skipping [host]" if it determines a task')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# should not be run on a host. Set this to "False" if you don\'t want to see these "Skipping"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# messages. NOTE: the task header will still be shown regardless of whether or not the")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# task is skipped.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#display_skipped_hosts = True")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# by default, if a task in a playbook does not include a name: field then")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ansible-playbook will construct a header that includes the task's action but")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# not the task's args. This is a security feature because ansible cannot know")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if the *module* considers an argument to be no_log at the time that the")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# header is printed. If your environment doesn't have a problem securing")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# stdout from ansible-playbook (or you have manually specified no_log in your")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# playbook on all of the tasks where you have secret information) then you can")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# safely set this to True to get more informative messages.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#display_args_to_stdout = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# by default (as of 1.3), Ansible will raise errors when attempting to dereference")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Jinja2 variables that are not set in templates or action lines. Uncomment this line")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# to revert the behavior to pre-1.3.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#error_on_undefined_vars = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# by default (as of 1.6), Ansible may display warnings based on the configuration of the")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# system running ansible itself. This may include warnings about 3rd party packages or")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# other conditions that should be resolved if possible.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# to disable these warnings, set the following value to False:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#system_warnings = True")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# by default (as of 1.4), Ansible may display deprecation warnings for language")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# features that should no longer be used and will be removed in future versions.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# to disable these warnings, set the following value to False:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#deprecation_warnings = True")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# (as of 1.8), Ansible can optionally warn when usage of the shell and")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# command module appear to be simplified by using a default Ansible module")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# instead. These warnings can be silenced by adjusting the following")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# setting or adding warn=yes or warn=no to the end of the command line")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# parameter string. This will for example suggest using the git module")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# instead of shelling out to the git command.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# command_warnings = False")]),s._v("\n\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# set plugin path directories here, separate with colons")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#action_plugins = /usr/share/ansible/plugins/action")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#become_plugins = /usr/share/ansible/plugins/become")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#cache_plugins = /usr/share/ansible/plugins/cache")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#callback_plugins = /usr/share/ansible/plugins/callback")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#connection_plugins = /usr/share/ansible/plugins/connection")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#lookup_plugins = /usr/share/ansible/plugins/lookup")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#inventory_plugins = /usr/share/ansible/plugins/inventory")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#vars_plugins = /usr/share/ansible/plugins/vars")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#filter_plugins = /usr/share/ansible/plugins/filter")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#test_plugins = /usr/share/ansible/plugins/test")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#terminal_plugins = /usr/share/ansible/plugins/terminal")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#strategy_plugins = /usr/share/ansible/plugins/strategy")]),s._v("\n\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# by default, ansible will use the 'linear' strategy but you may want to try")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# another one")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#strategy = free")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# by default callbacks are not loaded for /bin/ansible, enable this if you")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# want, for example, a notification or logging callback to also apply to")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /bin/ansible runs")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#bin_ansible_callbacks = False")]),s._v("\n\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# don't like cows? that's unfortunate.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# set to 1 if you don't want cowsay support or export ANSIBLE_NOCOWS=1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#nocows = 1")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# set which cowsay stencil you'd like to use by default. When set to 'random',")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# a random stencil will be selected for each task. The selection will be filtered")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# against the `cow_whitelist` option below.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#cow_selection = default")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#cow_selection = random")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# when using the 'random' option for cowsay, stencils will be restricted to this list.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# it should be formatted as a comma-separated list with no spaces between names.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# NOTE: line continuations here are for formatting purposes only, as the INI parser")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# in python does not support them.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#cow_whitelist=bud-frogs,bunny,cheese,daemon,default,dragon,elephant-in-snake,elephant,eyes,\\")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# hellokitty,kitty,luke-koala,meow,milk,moofasa,moose,ren,sheep,small,stegosaurus,\\")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# stimpy,supermilker,three-eyes,turkey,turtle,tux,udder,vader-koala,vader,www")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# don't like colors either?")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# set to 1 if you don't want colors, or export ANSIBLE_NOCOLOR=1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#nocolor = 1")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if set to a persistent type (not 'memory', for example 'redis') fact values")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# from previous runs in Ansible will be stored. This may be useful when")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# wanting to use, for example, IP information from one group of servers")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# without having to talk to them in the same playbook run to get their")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# current IP information.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#fact_caching = memory")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#This option tells Ansible where to cache facts. The value is plugin dependent.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#For the jsonfile plugin, it should be a path to a local directory.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#For the redis plugin, the value is a host:port:database triplet: fact_caching_connection = localhost:6379:0")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#fact_caching_connection=/tmp")]),s._v("\n\n\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# retry files")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# When a playbook fails a .retry file can be created that will be placed in ~/")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# You can enable this feature by setting retry_files_enabled to True")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# and you can change the location of the files by setting retry_files_save_path")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#retry_files_enabled = False")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#retry_files_save_path = ~/.ansible-retry")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# squash actions")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Ansible can optimise actions that call modules with list parameters")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# when looping. Instead of calling the module once per with_ item, the")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# module is called once with all items at once. Currently this only works")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# under limited circumstances, and only with parameters named 'name'.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#squash_actions = apk,apt,dnf,homebrew,pacman,pkgng,yum,zypper")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# prevents logging of task data, off by default")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#no_log = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# prevents logging of tasks, but only on the targets, data is still logged on the master/controller")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#no_target_syslog = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# controls whether Ansible will raise an error or warning if a task has no")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# choice but to create world readable temporary files to execute a module on")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# the remote machine. This option is False by default for security. Users may")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# turn this on to have behaviour more like Ansible prior to 2.1.x. See")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# for more secure ways to fix this than enabling this option.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#allow_world_readable_tmpfiles = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# controls the compression level of variables sent to")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# worker processes. At the default of 0, no compression")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# is used. This value must be an integer from 0 to 9.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#var_compression_level = 9")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# controls what compression method is used for new-style ansible modules when")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# they are sent to the remote system. The compression types depend on having")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# support compiled into both the controller's python and the client's python.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The names should match with the python Zipfile compression types:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * ZIP_STORED (no compression. available everywhere)")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * ZIP_DEFLATED (uses zlib, the default)")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# These values may be set per host via the ansible_module_compression inventory")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# variable")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#module_compression = 'ZIP_DEFLATED'")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# This controls the cutoff point (in bytes) on --diff for files")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# set to 0 for unlimited (RAM may suffer!).")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#max_diff_size = 1048576")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# This controls how ansible handles multiple --tags and --skip-tags arguments")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# on the CLI. If this is True then multiple arguments are merged together. If")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# it is False, then the last specified argument is used and the others are ignored.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# This option will be removed in 2.8.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#merge_multiple_cli_flags = True")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Controls showing custom stats at the end, off by default")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#show_custom_stats = True")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Controls which files to ignore when using a directory as inventory with")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# possibly multiple sources (both static and dynamic)")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#inventory_ignore_extensions = ~, .orig, .bak, .ini, .cfg, .retry, .pyc, .pyo")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# This family of modules use an alternative execution path optimized for network appliances")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# only update this setting if you know how this works, otherwise it can break module execution")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#network_group_modules=eos, nxos, ios, iosxr, junos, vyos")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# When enabled, this option allows lookups (via variables like {{lookup('foo')}} or when used as")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# a loop with `with_foo`) to return data that is not marked "unsafe". This means the data may contain')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# jinja2 templating language which will be run through the templating engine.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ENABLING THIS COULD BE A SECURITY RISK")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#allow_unsafe_lookups = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# set default errors for all plays")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#any_errors_fatal = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[s._v("inventory")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")])]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# enable inventory plugins, default: 'host_list', 'script', 'auto', 'yaml', 'ini', 'toml'")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#enable_plugins = host_list, virtualbox, yaml, constructed")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ignore these extensions when parsing a directory as inventory source")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#ignore_extensions = .pyc, .pyo, .swp, .bak, ~, .rpm, .md, .txt, ~, .orig, .ini, .cfg, .retry")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ignore files matching these patterns when parsing a directory as inventory source")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#ignore_patterns=")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# If 'true' unparsed inventory sources become fatal errors, they are warnings otherwise.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#unparsed_is_failed=False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[s._v("privilege_escalation")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")])]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#become=True")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#become_method=sudo")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#become_user=root")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#become_ask_pass=False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[s._v("paramiko_connection")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")])]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# uncomment this line to cause the paramiko connection plugin to not record new host")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# keys encountered. Increases performance on new host additions. Setting works independently of the")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# host key checking setting above.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#record_host_keys=False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# by default, Ansible requests a pseudo-terminal for commands executed under sudo. Uncomment this")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# line to disable this behaviour.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#pty=False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# paramiko will default to looking for SSH keys initially when trying to")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# authenticate to remote devices. This is a problem for some network devices")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# that close the connection after a key failure. Uncomment this line to")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# disable the Paramiko look for keys function")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#look_for_keys = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# When using persistent connections with Paramiko, the connection runs in a")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# background process. If the host doesn't already have a valid SSH key, by")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# default Ansible will prompt to add the host key. This will cause connections")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# running in background processes to fail. Uncomment this line to have")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Paramiko automatically add host keys.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#host_key_auto_add = True")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[s._v("ssh_connection")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")])]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ssh arguments to use")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Leaving off ControlPersist will result in poor performance, so use")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# paramiko on older platforms rather than removing it, -C controls compression use")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The base directory for the ControlPath sockets.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# This is the "%(directory)s" in the control_path option')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Example:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# control_path_dir = /tmp/.ansible/cp")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#control_path_dir = ~/.ansible/cp")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The path to use for the ControlPath sockets. This defaults to a hashed string of the hostname,")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# port and username (empty string in the config). The hash mitigates a common problem users")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# found with long hostnames and the conventional %(directory)s/ansible-ssh-%%h-%%p-%%r format.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# In those cases, a "too long for Unix domain socket" ssh error would occur.')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Example:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# control_path = %(directory)s/%%h-%%r")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#control_path =")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Enabling pipelining reduces the number of SSH operations required to")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# execute a module on the remote server. This can result in a significant")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# performance improvement when enabled, however when using "sudo:" you must')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# first disable 'requiretty' in /etc/sudoers")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# By default, this option is disabled to preserve compatibility with")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# sudoers configurations that have requiretty (the default on many distros).")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#pipelining = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Control the mechanism for transferring files (old)")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * smart = try sftp and then try scp [default]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * True = use scp only")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * False = use sftp only")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#scp_if_ssh = smart")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Control the mechanism for transferring files (new)")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# If set, this will override the scp_if_ssh option")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * sftp = use sftp to transfer files")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * scp = use scp to transfer files")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * piped = use 'dd' over SSH to transfer files")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * smart = try sftp, scp, and piped, in that order [default]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#transfer_method = smart")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# if False, sftp will not use batch mode to transfer files. This may cause some")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# types of file transfer failures impossible to catch however, and should")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# only be disabled if your sftp version has problems with batch mode")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#sftp_batch_mode = False")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The -tt argument is passed to ssh when pipelining is not enabled because sudo ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# requires a tty by default. ")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#usetty = True")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Number of times to retry an SSH connection to a host, in case of UNREACHABLE.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# For each retry attempt, there is an exponential backoff,")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# so after the first attempt there is 1s wait, then 2s, 4s etc. up to 30s (max).")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#retries = 3")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[s._v("persistent_connection")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")])]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Configures the persistent connection timeout value in seconds. This value is")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# how long the persistent connection will remain idle before it is destroyed.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# If the connection doesn't receive a request before the timeout value")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# expires, the connection is shutdown. The default value is 30 seconds.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#connect_timeout = 30")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The command timeout value defines the amount of time to wait for a command")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# or RPC call before timing out. The value for the command timeout must")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# be less than the value of the persistent connection idle timeout (connect_timeout)")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The default value is 30 second.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#command_timeout = 30")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[s._v("accelerate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")])]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#accelerate_port = 5099")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#accelerate_timeout = 30")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#accelerate_connect_timeout = 5.0")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The daemon timeout is measured in minutes. This time is measured")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# from the last activity to the accelerate daemon.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#accelerate_daemon_timeout = 30")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# If set to yes, accelerate_multi_key will allow multiple")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# private keys to be uploaded to it, though each user must")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# have access to the system via SSH to add a new key. The default")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# is "no".')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#accelerate_multi_key = yes")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[s._v("selinux")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")])]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# file systems that require special treatment when dealing with security context")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# the default behaviour that copies the existing context or uses the user default")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# needs to be changed to use the file system dependent context.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#special_context_filesystems=nfs,vboxsf,fuse,ramfs,9p,vfat")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Set this to yes to allow libvirt_lxc connections to work without SELinux.")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#libvirt_lxc_noseclabel = yes")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[s._v("colors")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")])]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#highlight = white")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#verbose = blue")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#warn = bright purple")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#error = red")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#debug = dark gray")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#deprecate = purple")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#skip = cyan")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#unreachable = red")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#ok = green")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#changed = yellow")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#diff_add = green")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#diff_remove = red")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#diff_lines = cyan")]),s._v("\n\n\n"),n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[s._v("diff")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")])]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Always print diff when running ( same as always running with -D/--diff )")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# always = no")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Set how many context lines to show in diff")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# context = 3")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br"),n("span",{staticClass:"line-number"},[s._v("40")]),n("br"),n("span",{staticClass:"line-number"},[s._v("41")]),n("br"),n("span",{staticClass:"line-number"},[s._v("42")]),n("br"),n("span",{staticClass:"line-number"},[s._v("43")]),n("br"),n("span",{staticClass:"line-number"},[s._v("44")]),n("br"),n("span",{staticClass:"line-number"},[s._v("45")]),n("br"),n("span",{staticClass:"line-number"},[s._v("46")]),n("br"),n("span",{staticClass:"line-number"},[s._v("47")]),n("br"),n("span",{staticClass:"line-number"},[s._v("48")]),n("br"),n("span",{staticClass:"line-number"},[s._v("49")]),n("br"),n("span",{staticClass:"line-number"},[s._v("50")]),n("br"),n("span",{staticClass:"line-number"},[s._v("51")]),n("br"),n("span",{staticClass:"line-number"},[s._v("52")]),n("br"),n("span",{staticClass:"line-number"},[s._v("53")]),n("br"),n("span",{staticClass:"line-number"},[s._v("54")]),n("br"),n("span",{staticClass:"line-number"},[s._v("55")]),n("br"),n("span",{staticClass:"line-number"},[s._v("56")]),n("br"),n("span",{staticClass:"line-number"},[s._v("57")]),n("br"),n("span",{staticClass:"line-number"},[s._v("58")]),n("br"),n("span",{staticClass:"line-number"},[s._v("59")]),n("br"),n("span",{staticClass:"line-number"},[s._v("60")]),n("br"),n("span",{staticClass:"line-number"},[s._v("61")]),n("br"),n("span",{staticClass:"line-number"},[s._v("62")]),n("br"),n("span",{staticClass:"line-number"},[s._v("63")]),n("br"),n("span",{staticClass:"line-number"},[s._v("64")]),n("br"),n("span",{staticClass:"line-number"},[s._v("65")]),n("br"),n("span",{staticClass:"line-number"},[s._v("66")]),n("br"),n("span",{staticClass:"line-number"},[s._v("67")]),n("br"),n("span",{staticClass:"line-number"},[s._v("68")]),n("br"),n("span",{staticClass:"line-number"},[s._v("69")]),n("br"),n("span",{staticClass:"line-number"},[s._v("70")]),n("br"),n("span",{staticClass:"line-number"},[s._v("71")]),n("br"),n("span",{staticClass:"line-number"},[s._v("72")]),n("br"),n("span",{staticClass:"line-number"},[s._v("73")]),n("br"),n("span",{staticClass:"line-number"},[s._v("74")]),n("br"),n("span",{staticClass:"line-number"},[s._v("75")]),n("br"),n("span",{staticClass:"line-number"},[s._v("76")]),n("br"),n("span",{staticClass:"line-number"},[s._v("77")]),n("br"),n("span",{staticClass:"line-number"},[s._v("78")]),n("br"),n("span",{staticClass:"line-number"},[s._v("79")]),n("br"),n("span",{staticClass:"line-number"},[s._v("80")]),n("br"),n("span",{staticClass:"line-number"},[s._v("81")]),n("br"),n("span",{staticClass:"line-number"},[s._v("82")]),n("br"),n("span",{staticClass:"line-number"},[s._v("83")]),n("br"),n("span",{staticClass:"line-number"},[s._v("84")]),n("br"),n("span",{staticClass:"line-number"},[s._v("85")]),n("br"),n("span",{staticClass:"line-number"},[s._v("86")]),n("br"),n("span",{staticClass:"line-number"},[s._v("87")]),n("br"),n("span",{staticClass:"line-number"},[s._v("88")]),n("br"),n("span",{staticClass:"line-number"},[s._v("89")]),n("br"),n("span",{staticClass:"line-number"},[s._v("90")]),n("br"),n("span",{staticClass:"line-number"},[s._v("91")]),n("br"),n("span",{staticClass:"line-number"},[s._v("92")]),n("br"),n("span",{staticClass:"line-number"},[s._v("93")]),n("br"),n("span",{staticClass:"line-number"},[s._v("94")]),n("br"),n("span",{staticClass:"line-number"},[s._v("95")]),n("br"),n("span",{staticClass:"line-number"},[s._v("96")]),n("br"),n("span",{staticClass:"line-number"},[s._v("97")]),n("br"),n("span",{staticClass:"line-number"},[s._v("98")]),n("br"),n("span",{staticClass:"line-number"},[s._v("99")]),n("br"),n("span",{staticClass:"line-number"},[s._v("100")]),n("br"),n("span",{staticClass:"line-number"},[s._v("101")]),n("br"),n("span",{staticClass:"line-number"},[s._v("102")]),n("br"),n("span",{staticClass:"line-number"},[s._v("103")]),n("br"),n("span",{staticClass:"line-number"},[s._v("104")]),n("br"),n("span",{staticClass:"line-number"},[s._v("105")]),n("br"),n("span",{staticClass:"line-number"},[s._v("106")]),n("br"),n("span",{staticClass:"line-number"},[s._v("107")]),n("br"),n("span",{staticClass:"line-number"},[s._v("108")]),n("br"),n("span",{staticClass:"line-number"},[s._v("109")]),n("br"),n("span",{staticClass:"line-number"},[s._v("110")]),n("br"),n("span",{staticClass:"line-number"},[s._v("111")]),n("br"),n("span",{staticClass:"line-number"},[s._v("112")]),n("br"),n("span",{staticClass:"line-number"},[s._v("113")]),n("br"),n("span",{staticClass:"line-number"},[s._v("114")]),n("br"),n("span",{staticClass:"line-number"},[s._v("115")]),n("br"),n("span",{staticClass:"line-number"},[s._v("116")]),n("br"),n("span",{staticClass:"line-number"},[s._v("117")]),n("br"),n("span",{staticClass:"line-number"},[s._v("118")]),n("br"),n("span",{staticClass:"line-number"},[s._v("119")]),n("br"),n("span",{staticClass:"line-number"},[s._v("120")]),n("br"),n("span",{staticClass:"line-number"},[s._v("121")]),n("br"),n("span",{staticClass:"line-number"},[s._v("122")]),n("br"),n("span",{staticClass:"line-number"},[s._v("123")]),n("br"),n("span",{staticClass:"line-number"},[s._v("124")]),n("br"),n("span",{staticClass:"line-number"},[s._v("125")]),n("br"),n("span",{staticClass:"line-number"},[s._v("126")]),n("br"),n("span",{staticClass:"line-number"},[s._v("127")]),n("br"),n("span",{staticClass:"line-number"},[s._v("128")]),n("br"),n("span",{staticClass:"line-number"},[s._v("129")]),n("br"),n("span",{staticClass:"line-number"},[s._v("130")]),n("br"),n("span",{staticClass:"line-number"},[s._v("131")]),n("br"),n("span",{staticClass:"line-number"},[s._v("132")]),n("br"),n("span",{staticClass:"line-number"},[s._v("133")]),n("br"),n("span",{staticClass:"line-number"},[s._v("134")]),n("br"),n("span",{staticClass:"line-number"},[s._v("135")]),n("br"),n("span",{staticClass:"line-number"},[s._v("136")]),n("br"),n("span",{staticClass:"line-number"},[s._v("137")]),n("br"),n("span",{staticClass:"line-number"},[s._v("138")]),n("br"),n("span",{staticClass:"line-number"},[s._v("139")]),n("br"),n("span",{staticClass:"line-number"},[s._v("140")]),n("br"),n("span",{staticClass:"line-number"},[s._v("141")]),n("br"),n("span",{staticClass:"line-number"},[s._v("142")]),n("br"),n("span",{staticClass:"line-number"},[s._v("143")]),n("br"),n("span",{staticClass:"line-number"},[s._v("144")]),n("br"),n("span",{staticClass:"line-number"},[s._v("145")]),n("br"),n("span",{staticClass:"line-number"},[s._v("146")]),n("br"),n("span",{staticClass:"line-number"},[s._v("147")]),n("br"),n("span",{staticClass:"line-number"},[s._v("148")]),n("br"),n("span",{staticClass:"line-number"},[s._v("149")]),n("br"),n("span",{staticClass:"line-number"},[s._v("150")]),n("br"),n("span",{staticClass:"line-number"},[s._v("151")]),n("br"),n("span",{staticClass:"line-number"},[s._v("152")]),n("br"),n("span",{staticClass:"line-number"},[s._v("153")]),n("br"),n("span",{staticClass:"line-number"},[s._v("154")]),n("br"),n("span",{staticClass:"line-number"},[s._v("155")]),n("br"),n("span",{staticClass:"line-number"},[s._v("156")]),n("br"),n("span",{staticClass:"line-number"},[s._v("157")]),n("br"),n("span",{staticClass:"line-number"},[s._v("158")]),n("br"),n("span",{staticClass:"line-number"},[s._v("159")]),n("br"),n("span",{staticClass:"line-number"},[s._v("160")]),n("br"),n("span",{staticClass:"line-number"},[s._v("161")]),n("br"),n("span",{staticClass:"line-number"},[s._v("162")]),n("br"),n("span",{staticClass:"line-number"},[s._v("163")]),n("br"),n("span",{staticClass:"line-number"},[s._v("164")]),n("br"),n("span",{staticClass:"line-number"},[s._v("165")]),n("br"),n("span",{staticClass:"line-number"},[s._v("166")]),n("br"),n("span",{staticClass:"line-number"},[s._v("167")]),n("br"),n("span",{staticClass:"line-number"},[s._v("168")]),n("br"),n("span",{staticClass:"line-number"},[s._v("169")]),n("br"),n("span",{staticClass:"line-number"},[s._v("170")]),n("br"),n("span",{staticClass:"line-number"},[s._v("171")]),n("br"),n("span",{staticClass:"line-number"},[s._v("172")]),n("br"),n("span",{staticClass:"line-number"},[s._v("173")]),n("br"),n("span",{staticClass:"line-number"},[s._v("174")]),n("br"),n("span",{staticClass:"line-number"},[s._v("175")]),n("br"),n("span",{staticClass:"line-number"},[s._v("176")]),n("br"),n("span",{staticClass:"line-number"},[s._v("177")]),n("br"),n("span",{staticClass:"line-number"},[s._v("178")]),n("br"),n("span",{staticClass:"line-number"},[s._v("179")]),n("br"),n("span",{staticClass:"line-number"},[s._v("180")]),n("br"),n("span",{staticClass:"line-number"},[s._v("181")]),n("br"),n("span",{staticClass:"line-number"},[s._v("182")]),n("br"),n("span",{staticClass:"line-number"},[s._v("183")]),n("br"),n("span",{staticClass:"line-number"},[s._v("184")]),n("br"),n("span",{staticClass:"line-number"},[s._v("185")]),n("br"),n("span",{staticClass:"line-number"},[s._v("186")]),n("br"),n("span",{staticClass:"line-number"},[s._v("187")]),n("br"),n("span",{staticClass:"line-number"},[s._v("188")]),n("br"),n("span",{staticClass:"line-number"},[s._v("189")]),n("br"),n("span",{staticClass:"line-number"},[s._v("190")]),n("br"),n("span",{staticClass:"line-number"},[s._v("191")]),n("br"),n("span",{staticClass:"line-number"},[s._v("192")]),n("br"),n("span",{staticClass:"line-number"},[s._v("193")]),n("br"),n("span",{staticClass:"line-number"},[s._v("194")]),n("br"),n("span",{staticClass:"line-number"},[s._v("195")]),n("br"),n("span",{staticClass:"line-number"},[s._v("196")]),n("br"),n("span",{staticClass:"line-number"},[s._v("197")]),n("br"),n("span",{staticClass:"line-number"},[s._v("198")]),n("br"),n("span",{staticClass:"line-number"},[s._v("199")]),n("br"),n("span",{staticClass:"line-number"},[s._v("200")]),n("br"),n("span",{staticClass:"line-number"},[s._v("201")]),n("br"),n("span",{staticClass:"line-number"},[s._v("202")]),n("br"),n("span",{staticClass:"line-number"},[s._v("203")]),n("br"),n("span",{staticClass:"line-number"},[s._v("204")]),n("br"),n("span",{staticClass:"line-number"},[s._v("205")]),n("br"),n("span",{staticClass:"line-number"},[s._v("206")]),n("br"),n("span",{staticClass:"line-number"},[s._v("207")]),n("br"),n("span",{staticClass:"line-number"},[s._v("208")]),n("br"),n("span",{staticClass:"line-number"},[s._v("209")]),n("br"),n("span",{staticClass:"line-number"},[s._v("210")]),n("br"),n("span",{staticClass:"line-number"},[s._v("211")]),n("br"),n("span",{staticClass:"line-number"},[s._v("212")]),n("br"),n("span",{staticClass:"line-number"},[s._v("213")]),n("br"),n("span",{staticClass:"line-number"},[s._v("214")]),n("br"),n("span",{staticClass:"line-number"},[s._v("215")]),n("br"),n("span",{staticClass:"line-number"},[s._v("216")]),n("br"),n("span",{staticClass:"line-number"},[s._v("217")]),n("br"),n("span",{staticClass:"line-number"},[s._v("218")]),n("br"),n("span",{staticClass:"line-number"},[s._v("219")]),n("br"),n("span",{staticClass:"line-number"},[s._v("220")]),n("br"),n("span",{staticClass:"line-number"},[s._v("221")]),n("br"),n("span",{staticClass:"line-number"},[s._v("222")]),n("br"),n("span",{staticClass:"line-number"},[s._v("223")]),n("br"),n("span",{staticClass:"line-number"},[s._v("224")]),n("br"),n("span",{staticClass:"line-number"},[s._v("225")]),n("br"),n("span",{staticClass:"line-number"},[s._v("226")]),n("br"),n("span",{staticClass:"line-number"},[s._v("227")]),n("br"),n("span",{staticClass:"line-number"},[s._v("228")]),n("br"),n("span",{staticClass:"line-number"},[s._v("229")]),n("br"),n("span",{staticClass:"line-number"},[s._v("230")]),n("br"),n("span",{staticClass:"line-number"},[s._v("231")]),n("br"),n("span",{staticClass:"line-number"},[s._v("232")]),n("br"),n("span",{staticClass:"line-number"},[s._v("233")]),n("br"),n("span",{staticClass:"line-number"},[s._v("234")]),n("br"),n("span",{staticClass:"line-number"},[s._v("235")]),n("br"),n("span",{staticClass:"line-number"},[s._v("236")]),n("br"),n("span",{staticClass:"line-number"},[s._v("237")]),n("br"),n("span",{staticClass:"line-number"},[s._v("238")]),n("br"),n("span",{staticClass:"line-number"},[s._v("239")]),n("br"),n("span",{staticClass:"line-number"},[s._v("240")]),n("br"),n("span",{staticClass:"line-number"},[s._v("241")]),n("br"),n("span",{staticClass:"line-number"},[s._v("242")]),n("br"),n("span",{staticClass:"line-number"},[s._v("243")]),n("br"),n("span",{staticClass:"line-number"},[s._v("244")]),n("br"),n("span",{staticClass:"line-number"},[s._v("245")]),n("br"),n("span",{staticClass:"line-number"},[s._v("246")]),n("br"),n("span",{staticClass:"line-number"},[s._v("247")]),n("br"),n("span",{staticClass:"line-number"},[s._v("248")]),n("br"),n("span",{staticClass:"line-number"},[s._v("249")]),n("br"),n("span",{staticClass:"line-number"},[s._v("250")]),n("br"),n("span",{staticClass:"line-number"},[s._v("251")]),n("br"),n("span",{staticClass:"line-number"},[s._v("252")]),n("br"),n("span",{staticClass:"line-number"},[s._v("253")]),n("br"),n("span",{staticClass:"line-number"},[s._v("254")]),n("br"),n("span",{staticClass:"line-number"},[s._v("255")]),n("br"),n("span",{staticClass:"line-number"},[s._v("256")]),n("br"),n("span",{staticClass:"line-number"},[s._v("257")]),n("br"),n("span",{staticClass:"line-number"},[s._v("258")]),n("br"),n("span",{staticClass:"line-number"},[s._v("259")]),n("br"),n("span",{staticClass:"line-number"},[s._v("260")]),n("br"),n("span",{staticClass:"line-number"},[s._v("261")]),n("br"),n("span",{staticClass:"line-number"},[s._v("262")]),n("br"),n("span",{staticClass:"line-number"},[s._v("263")]),n("br"),n("span",{staticClass:"line-number"},[s._v("264")]),n("br"),n("span",{staticClass:"line-number"},[s._v("265")]),n("br"),n("span",{staticClass:"line-number"},[s._v("266")]),n("br"),n("span",{staticClass:"line-number"},[s._v("267")]),n("br"),n("span",{staticClass:"line-number"},[s._v("268")]),n("br"),n("span",{staticClass:"line-number"},[s._v("269")]),n("br"),n("span",{staticClass:"line-number"},[s._v("270")]),n("br"),n("span",{staticClass:"line-number"},[s._v("271")]),n("br"),n("span",{staticClass:"line-number"},[s._v("272")]),n("br"),n("span",{staticClass:"line-number"},[s._v("273")]),n("br"),n("span",{staticClass:"line-number"},[s._v("274")]),n("br"),n("span",{staticClass:"line-number"},[s._v("275")]),n("br"),n("span",{staticClass:"line-number"},[s._v("276")]),n("br"),n("span",{staticClass:"line-number"},[s._v("277")]),n("br"),n("span",{staticClass:"line-number"},[s._v("278")]),n("br"),n("span",{staticClass:"line-number"},[s._v("279")]),n("br"),n("span",{staticClass:"line-number"},[s._v("280")]),n("br"),n("span",{staticClass:"line-number"},[s._v("281")]),n("br"),n("span",{staticClass:"line-number"},[s._v("282")]),n("br"),n("span",{staticClass:"line-number"},[s._v("283")]),n("br"),n("span",{staticClass:"line-number"},[s._v("284")]),n("br"),n("span",{staticClass:"line-number"},[s._v("285")]),n("br"),n("span",{staticClass:"line-number"},[s._v("286")]),n("br"),n("span",{staticClass:"line-number"},[s._v("287")]),n("br"),n("span",{staticClass:"line-number"},[s._v("288")]),n("br"),n("span",{staticClass:"line-number"},[s._v("289")]),n("br"),n("span",{staticClass:"line-number"},[s._v("290")]),n("br"),n("span",{staticClass:"line-number"},[s._v("291")]),n("br"),n("span",{staticClass:"line-number"},[s._v("292")]),n("br"),n("span",{staticClass:"line-number"},[s._v("293")]),n("br"),n("span",{staticClass:"line-number"},[s._v("294")]),n("br"),n("span",{staticClass:"line-number"},[s._v("295")]),n("br"),n("span",{staticClass:"line-number"},[s._v("296")]),n("br"),n("span",{staticClass:"line-number"},[s._v("297")]),n("br"),n("span",{staticClass:"line-number"},[s._v("298")]),n("br"),n("span",{staticClass:"line-number"},[s._v("299")]),n("br"),n("span",{staticClass:"line-number"},[s._v("300")]),n("br"),n("span",{staticClass:"line-number"},[s._v("301")]),n("br"),n("span",{staticClass:"line-number"},[s._v("302")]),n("br"),n("span",{staticClass:"line-number"},[s._v("303")]),n("br"),n("span",{staticClass:"line-number"},[s._v("304")]),n("br"),n("span",{staticClass:"line-number"},[s._v("305")]),n("br"),n("span",{staticClass:"line-number"},[s._v("306")]),n("br"),n("span",{staticClass:"line-number"},[s._v("307")]),n("br"),n("span",{staticClass:"line-number"},[s._v("308")]),n("br"),n("span",{staticClass:"line-number"},[s._v("309")]),n("br"),n("span",{staticClass:"line-number"},[s._v("310")]),n("br"),n("span",{staticClass:"line-number"},[s._v("311")]),n("br"),n("span",{staticClass:"line-number"},[s._v("312")]),n("br"),n("span",{staticClass:"line-number"},[s._v("313")]),n("br"),n("span",{staticClass:"line-number"},[s._v("314")]),n("br"),n("span",{staticClass:"line-number"},[s._v("315")]),n("br"),n("span",{staticClass:"line-number"},[s._v("316")]),n("br"),n("span",{staticClass:"line-number"},[s._v("317")]),n("br"),n("span",{staticClass:"line-number"},[s._v("318")]),n("br"),n("span",{staticClass:"line-number"},[s._v("319")]),n("br"),n("span",{staticClass:"line-number"},[s._v("320")]),n("br"),n("span",{staticClass:"line-number"},[s._v("321")]),n("br"),n("span",{staticClass:"line-number"},[s._v("322")]),n("br"),n("span",{staticClass:"line-number"},[s._v("323")]),n("br"),n("span",{staticClass:"line-number"},[s._v("324")]),n("br"),n("span",{staticClass:"line-number"},[s._v("325")]),n("br"),n("span",{staticClass:"line-number"},[s._v("326")]),n("br"),n("span",{staticClass:"line-number"},[s._v("327")]),n("br"),n("span",{staticClass:"line-number"},[s._v("328")]),n("br"),n("span",{staticClass:"line-number"},[s._v("329")]),n("br"),n("span",{staticClass:"line-number"},[s._v("330")]),n("br"),n("span",{staticClass:"line-number"},[s._v("331")]),n("br"),n("span",{staticClass:"line-number"},[s._v("332")]),n("br"),n("span",{staticClass:"line-number"},[s._v("333")]),n("br"),n("span",{staticClass:"line-number"},[s._v("334")]),n("br"),n("span",{staticClass:"line-number"},[s._v("335")]),n("br"),n("span",{staticClass:"line-number"},[s._v("336")]),n("br"),n("span",{staticClass:"line-number"},[s._v("337")]),n("br"),n("span",{staticClass:"line-number"},[s._v("338")]),n("br"),n("span",{staticClass:"line-number"},[s._v("339")]),n("br"),n("span",{staticClass:"line-number"},[s._v("340")]),n("br"),n("span",{staticClass:"line-number"},[s._v("341")]),n("br"),n("span",{staticClass:"line-number"},[s._v("342")]),n("br"),n("span",{staticClass:"line-number"},[s._v("343")]),n("br"),n("span",{staticClass:"line-number"},[s._v("344")]),n("br"),n("span",{staticClass:"line-number"},[s._v("345")]),n("br"),n("span",{staticClass:"line-number"},[s._v("346")]),n("br"),n("span",{staticClass:"line-number"},[s._v("347")]),n("br"),n("span",{staticClass:"line-number"},[s._v("348")]),n("br"),n("span",{staticClass:"line-number"},[s._v("349")]),n("br"),n("span",{staticClass:"line-number"},[s._v("350")]),n("br"),n("span",{staticClass:"line-number"},[s._v("351")]),n("br"),n("span",{staticClass:"line-number"},[s._v("352")]),n("br"),n("span",{staticClass:"line-number"},[s._v("353")]),n("br"),n("span",{staticClass:"line-number"},[s._v("354")]),n("br"),n("span",{staticClass:"line-number"},[s._v("355")]),n("br"),n("span",{staticClass:"line-number"},[s._v("356")]),n("br"),n("span",{staticClass:"line-number"},[s._v("357")]),n("br"),n("span",{staticClass:"line-number"},[s._v("358")]),n("br"),n("span",{staticClass:"line-number"},[s._v("359")]),n("br"),n("span",{staticClass:"line-number"},[s._v("360")]),n("br"),n("span",{staticClass:"line-number"},[s._v("361")]),n("br"),n("span",{staticClass:"line-number"},[s._v("362")]),n("br"),n("span",{staticClass:"line-number"},[s._v("363")]),n("br"),n("span",{staticClass:"line-number"},[s._v("364")]),n("br"),n("span",{staticClass:"line-number"},[s._v("365")]),n("br"),n("span",{staticClass:"line-number"},[s._v("366")]),n("br"),n("span",{staticClass:"line-number"},[s._v("367")]),n("br"),n("span",{staticClass:"line-number"},[s._v("368")]),n("br"),n("span",{staticClass:"line-number"},[s._v("369")]),n("br"),n("span",{staticClass:"line-number"},[s._v("370")]),n("br"),n("span",{staticClass:"line-number"},[s._v("371")]),n("br"),n("span",{staticClass:"line-number"},[s._v("372")]),n("br"),n("span",{staticClass:"line-number"},[s._v("373")]),n("br"),n("span",{staticClass:"line-number"},[s._v("374")]),n("br"),n("span",{staticClass:"line-number"},[s._v("375")]),n("br"),n("span",{staticClass:"line-number"},[s._v("376")]),n("br"),n("span",{staticClass:"line-number"},[s._v("377")]),n("br"),n("span",{staticClass:"line-number"},[s._v("378")]),n("br"),n("span",{staticClass:"line-number"},[s._v("379")]),n("br"),n("span",{staticClass:"line-number"},[s._v("380")]),n("br"),n("span",{staticClass:"line-number"},[s._v("381")]),n("br"),n("span",{staticClass:"line-number"},[s._v("382")]),n("br"),n("span",{staticClass:"line-number"},[s._v("383")]),n("br"),n("span",{staticClass:"line-number"},[s._v("384")]),n("br"),n("span",{staticClass:"line-number"},[s._v("385")]),n("br"),n("span",{staticClass:"line-number"},[s._v("386")]),n("br"),n("span",{staticClass:"line-number"},[s._v("387")]),n("br"),n("span",{staticClass:"line-number"},[s._v("388")]),n("br"),n("span",{staticClass:"line-number"},[s._v("389")]),n("br"),n("span",{staticClass:"line-number"},[s._v("390")]),n("br"),n("span",{staticClass:"line-number"},[s._v("391")]),n("br"),n("span",{staticClass:"line-number"},[s._v("392")]),n("br"),n("span",{staticClass:"line-number"},[s._v("393")]),n("br"),n("span",{staticClass:"line-number"},[s._v("394")]),n("br"),n("span",{staticClass:"line-number"},[s._v("395")]),n("br"),n("span",{staticClass:"line-number"},[s._v("396")]),n("br"),n("span",{staticClass:"line-number"},[s._v("397")]),n("br"),n("span",{staticClass:"line-number"},[s._v("398")]),n("br"),n("span",{staticClass:"line-number"},[s._v("399")]),n("br"),n("span",{staticClass:"line-number"},[s._v("400")]),n("br"),n("span",{staticClass:"line-number"},[s._v("401")]),n("br"),n("span",{staticClass:"line-number"},[s._v("402")]),n("br"),n("span",{staticClass:"line-number"},[s._v("403")]),n("br"),n("span",{staticClass:"line-number"},[s._v("404")]),n("br"),n("span",{staticClass:"line-number"},[s._v("405")]),n("br"),n("span",{staticClass:"line-number"},[s._v("406")]),n("br"),n("span",{staticClass:"line-number"},[s._v("407")]),n("br"),n("span",{staticClass:"line-number"},[s._v("408")]),n("br"),n("span",{staticClass:"line-number"},[s._v("409")]),n("br"),n("span",{staticClass:"line-number"},[s._v("410")]),n("br"),n("span",{staticClass:"line-number"},[s._v("411")]),n("br"),n("span",{staticClass:"line-number"},[s._v("412")]),n("br"),n("span",{staticClass:"line-number"},[s._v("413")]),n("br"),n("span",{staticClass:"line-number"},[s._v("414")]),n("br"),n("span",{staticClass:"line-number"},[s._v("415")]),n("br"),n("span",{staticClass:"line-number"},[s._v("416")]),n("br"),n("span",{staticClass:"line-number"},[s._v("417")]),n("br"),n("span",{staticClass:"line-number"},[s._v("418")]),n("br"),n("span",{staticClass:"line-number"},[s._v("419")]),n("br"),n("span",{staticClass:"line-number"},[s._v("420")]),n("br"),n("span",{staticClass:"line-number"},[s._v("421")]),n("br"),n("span",{staticClass:"line-number"},[s._v("422")]),n("br"),n("span",{staticClass:"line-number"},[s._v("423")]),n("br"),n("span",{staticClass:"line-number"},[s._v("424")]),n("br"),n("span",{staticClass:"line-number"},[s._v("425")]),n("br"),n("span",{staticClass:"line-number"},[s._v("426")]),n("br"),n("span",{staticClass:"line-number"},[s._v("427")]),n("br"),n("span",{staticClass:"line-number"},[s._v("428")]),n("br"),n("span",{staticClass:"line-number"},[s._v("429")]),n("br"),n("span",{staticClass:"line-number"},[s._v("430")]),n("br"),n("span",{staticClass:"line-number"},[s._v("431")]),n("br"),n("span",{staticClass:"line-number"},[s._v("432")]),n("br"),n("span",{staticClass:"line-number"},[s._v("433")]),n("br"),n("span",{staticClass:"line-number"},[s._v("434")]),n("br"),n("span",{staticClass:"line-number"},[s._v("435")]),n("br"),n("span",{staticClass:"line-number"},[s._v("436")]),n("br"),n("span",{staticClass:"line-number"},[s._v("437")]),n("br"),n("span",{staticClass:"line-number"},[s._v("438")]),n("br"),n("span",{staticClass:"line-number"},[s._v("439")]),n("br"),n("span",{staticClass:"line-number"},[s._v("440")]),n("br"),n("span",{staticClass:"line-number"},[s._v("441")]),n("br"),n("span",{staticClass:"line-number"},[s._v("442")]),n("br"),n("span",{staticClass:"line-number"},[s._v("443")]),n("br"),n("span",{staticClass:"line-number"},[s._v("444")]),n("br"),n("span",{staticClass:"line-number"},[s._v("445")]),n("br"),n("span",{staticClass:"line-number"},[s._v("446")]),n("br"),n("span",{staticClass:"line-number"},[s._v("447")]),n("br"),n("span",{staticClass:"line-number"},[s._v("448")]),n("br"),n("span",{staticClass:"line-number"},[s._v("449")]),n("br"),n("span",{staticClass:"line-number"},[s._v("450")]),n("br"),n("span",{staticClass:"line-number"},[s._v("451")]),n("br"),n("span",{staticClass:"line-number"},[s._v("452")]),n("br"),n("span",{staticClass:"line-number"},[s._v("453")]),n("br"),n("span",{staticClass:"line-number"},[s._v("454")]),n("br"),n("span",{staticClass:"line-number"},[s._v("455")]),n("br"),n("span",{staticClass:"line-number"},[s._v("456")]),n("br"),n("span",{staticClass:"line-number"},[s._v("457")]),n("br"),n("span",{staticClass:"line-number"},[s._v("458")]),n("br"),n("span",{staticClass:"line-number"},[s._v("459")]),n("br"),n("span",{staticClass:"line-number"},[s._v("460")]),n("br"),n("span",{staticClass:"line-number"},[s._v("461")]),n("br"),n("span",{staticClass:"line-number"},[s._v("462")]),n("br"),n("span",{staticClass:"line-number"},[s._v("463")]),n("br"),n("span",{staticClass:"line-number"},[s._v("464")]),n("br"),n("span",{staticClass:"line-number"},[s._v("465")]),n("br"),n("span",{staticClass:"line-number"},[s._v("466")]),n("br"),n("span",{staticClass:"line-number"},[s._v("467")]),n("br"),n("span",{staticClass:"line-number"},[s._v("468")]),n("br"),n("span",{staticClass:"line-number"},[s._v("469")]),n("br"),n("span",{staticClass:"line-number"},[s._v("470")]),n("br"),n("span",{staticClass:"line-number"},[s._v("471")]),n("br"),n("span",{staticClass:"line-number"},[s._v("472")]),n("br"),n("span",{staticClass:"line-number"},[s._v("473")]),n("br"),n("span",{staticClass:"line-number"},[s._v("474")]),n("br"),n("span",{staticClass:"line-number"},[s._v("475")]),n("br"),n("span",{staticClass:"line-number"},[s._v("476")]),n("br"),n("span",{staticClass:"line-number"},[s._v("477")]),n("br"),n("span",{staticClass:"line-number"},[s._v("478")]),n("br"),n("span",{staticClass:"line-number"},[s._v("479")]),n("br"),n("span",{staticClass:"line-number"},[s._v("480")]),n("br"),n("span",{staticClass:"line-number"},[s._v("481")]),n("br"),n("span",{staticClass:"line-number"},[s._v("482")]),n("br"),n("span",{staticClass:"line-number"},[s._v("483")]),n("br"),n("span",{staticClass:"line-number"},[s._v("484")]),n("br"),n("span",{staticClass:"line-number"},[s._v("485")]),n("br"),n("span",{staticClass:"line-number"},[s._v("486")]),n("br"),n("span",{staticClass:"line-number"},[s._v("487")]),n("br"),n("span",{staticClass:"line-number"},[s._v("488")]),n("br"),n("span",{staticClass:"line-number"},[s._v("489")]),n("br"),n("span",{staticClass:"line-number"},[s._v("490")]),n("br")])]),n("h2",{attrs:{id:"ansible的命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ansible的命令"}},[s._v("#")]),s._v(" Ansible的命令")]),s._v(" "),n("h3",{attrs:{id:"ansible"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ansible"}},[s._v("#")]),s._v(" ansible")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://docs.ansible.com/ansible/latest/command_guide/intro_adhoc.html#intro-adhoc",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.ansible.com/ansible/latest/command_guide/intro_adhoc.html#intro-adhoc"),n("OutboundLink")],1)]),s._v(" "),n("p",[n("a",{attrs:{href:"https://docs.ansible.com/ansible/latest/cli/ansible.html#ansible",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.ansible.com/ansible/latest/cli/ansible.html#ansible"),n("OutboundLink")],1)]),s._v(" "),n("p",[s._v("ad-hoc(临时命令模式)主要用于临时命令的执行。使用格式如下:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ansible "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("host-pattern"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" -m "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("module"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"[module options]"')]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[n("code",[s._v("")]),s._v(" 是Inventory中定义的主机或主机组,可以为ip、hostname、Inventory中的group组名、具有“.”或“*”或“:”等特殊字符的匹配型字符串。")]),s._v(" "),n("p",[n("code",[s._v("[module options]")]),s._v("是ansible的参数选项。")]),s._v(" "),n("ul",[n("li",[n("p",[s._v("-i 'PATH', --inventory 'PATH':指定hosts文件路径,默认/etc/ansible/hosts")])]),s._v(" "),n("li",[n("p",[s._v("-m 'MODULE_NAME', --module-name 'MODULE_NAME':指定执行使用的模块 ,默认是command。")])]),s._v(" "),n("li",[n("p",[s._v("-a 'MODULE_ARGS', --args 'MODULE_ARGS':指定模块参数。")])]),s._v(" "),n("li",[n("p",[s._v("-u 'REMOTE_USER', --user 'REMOTE_USER':指定远程主机以USERNAME运行命令。")])]),s._v(" "),n("li",[n("p",[s._v("-k, --ask-pass:询问连接密码。")])]),s._v(" "),n("li",[n("p",[s._v("-v, --verbose:详细模式(-vvv更多,-vvv启用连接调试)。使用 -vvv 参数可以清楚地了解Ansible命令执行流程。")]),s._v(" "),n("p",[n("img",{attrs:{src:e(534),alt:""}})])])]),s._v(" "),n("p",[s._v("使用"),n("code",[s._v("man ansible")]),s._v("可以查看详细选项。")]),s._v(" "),n("h3",{attrs:{id:"ansible-playbook"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ansible-playbook"}},[s._v("#")]),s._v(" ansible-playbook")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html#ansible-playbook",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html#ansible-playbook"),n("OutboundLink")],1)]),s._v(" "),n("p",[s._v("使用格式如下:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ansible-playbook playbook.yml\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("h4",{attrs:{id:"playbook"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#playbook"}},[s._v("#")]),s._v(" playbook")]),s._v(" "),n("p",[s._v("playbook(剧本模式)可以理解为ad-hoc的集合,通过一定的规则编排在一起。")]),s._v(" "),n("p",[s._v("一个playbook就是play的列表。")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th"),s._v(" "),n("th",[s._v("是否必需")]),s._v(" "),n("th",[s._v("描述")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("hosts")]),s._v(" "),n("td",[s._v("是")]),s._v(" "),n("td",[s._v("需要配置的一组主机。")])]),s._v(" "),n("tr",[n("td",[s._v("tasks")]),s._v(" "),n("td",[s._v("是")]),s._v(" "),n("td",[s._v("需要在这组主机上执行的任务。"),n("br"),s._v("每个task必须包含一个键值对。"),n("br"),s._v("键是模块的名字,值是要传递到模块的参数。"),n("br"),s._v("task中可以声明一个notify,键是notify,值是handler的名字。")])]),s._v(" "),n("tr",[n("td",[s._v("vars")]),s._v(" "),n("td",[s._v("否")]),s._v(" "),n("td",[s._v("定义变量。在vars区段中定义变量的名字与值。使用"),n("code",[s._v(s._s(s.variable_name))]),s._v("引用变量。")])]),s._v(" "),n("tr",[n("td",[s._v("vars_files")]),s._v(" "),n("td",[s._v("否")]),s._v(" "),n("td",[s._v("定义变量。把变量放到一个或多个文件中。")])]),s._v(" "),n("tr",[n("td",[s._v("handlers")]),s._v(" "),n("td",[s._v("否")]),s._v(" "),n("td",[s._v("与tasks很相似。"),n("br"),s._v("handler只会在所有task执行完后执行。"),n("br"),s._v("哪怕被通知了多次,它也只执行一次。"),n("br"),s._v("当play中定义了多个handler时,handler安装play中定义的顺序执行,而不是通知的顺序。")])])])]),s._v(" "),n("h4",{attrs:{id:"role"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#role"}},[s._v("#")]),s._v(" role")]),s._v(" "),n("p",[s._v("role是将playbook分割为多个文件的主要机制。")]),s._v(" "),n("h3",{attrs:{id:"ansible-doc"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ansible-doc"}},[s._v("#")]),s._v(" ansible-doc")]),s._v(" "),n("p",[s._v("ansible-doc是Ansible模块文档说明。")]),s._v(" "),n("p",[s._v("使用方式:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ansible-doc "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("options"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("module"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("常用选项:")]),s._v(" "),n("ul",[n("li",[s._v("-l, --list:列出可用模块")]),s._v(" "),n("li",[s._v("-s, --snippet:显示指定模块的playbook片段")])]),s._v(" "),n("p",[s._v("具体示例:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 列出可用模块")]),s._v("\nansible-doc -l\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 功能模块说明")]),s._v("\nansible-doc "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v("\nansible-doc shell\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 显示指定模块的playbook片段")]),s._v("\nansible-doc -s "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v("\nansible-doc -s shell\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("h2",{attrs:{id:"ansible的模块"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ansible的模块"}},[s._v("#")]),s._v(" Ansible的模块")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://docs.ansible.com/ansible/latest/module_plugin_guide/modules_intro.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.ansible.com/ansible/latest/module_plugin_guide/modules_intro.html"),n("OutboundLink")],1)]),s._v(" "),n("h3",{attrs:{id:"debug模块"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#debug模块"}},[s._v("#")]),s._v(" debug模块")]),s._v(" "),n("p",[s._v("debug模块:打印任意信息。例如:输出变量的值"),n("code",[s._v("- debug: var=myvarname")]),s._v("。")]),s._v(" "),n("div",{staticClass:"language-yaml line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-yaml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("---")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" usage of register and debug module\n"),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("hosts")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" managednodes\n"),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("tasks")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" capture output of id command\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("command")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" id "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("un\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("register")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" login "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 捕获id -un命令的输出到名为login的变量中")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("debug")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" var=login "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 使用debug模块输出login变量")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("p",[s._v("debug模块的输出类似如下:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code")]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"})]),n("h3",{attrs:{id:"command模块‌"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#command模块‌"}},[s._v("#")]),s._v(" command模块‌")]),s._v(" "),n("p",[s._v("‌command模块‌:用于在远程主机上执行命令。此模块为默认模块。")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",{staticStyle:{"text-align":"left"}},[s._v("常用参数")]),s._v(" "),n("th",{staticStyle:{"text-align":"left"}},[s._v("功能")])])]),s._v(" "),n("tbody",[n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("chdir")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("执行命令前先进入到指定目录")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("cmd")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("运行命令指定")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("creates")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("如果文件存在将不运行命令")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("removes")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("如果文件存在将运行命令")])])])]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ansible all -m "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v(" -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'chdir=/mnt pwd'")]),s._v("\nansible all -m "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v(" -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'chdir=/mnt cmd=pwd'")]),s._v("\nansible all -m "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v(" -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'chdir=/mnt creates=/mnt/file pwd'")]),s._v("\nansible all -m "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v(" -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'chdir=/mnt removes=/mnt/file pwd'")]),s._v("\nansible all -m "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v(" -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'chdir=/mnt touch file'")]),s._v("\nansible all -m "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v(" -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'chdir=/mnt creates=/mnt/file pwd'")]),s._v("\nansible all -m "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v(" -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'chdir=/mnt removes=/mnt/file pwd'")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br")])]),n("h3",{attrs:{id:"shell模块"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#shell模块"}},[s._v("#")]),s._v(" shell模块")]),s._v(" "),n("p",[s._v("shell模块‌:用于在远程主机上执行命令。Shell模块支持变量引用、管道符和重定向,可以执行更复杂的命令‌。")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",{staticStyle:{"text-align":"left"}},[s._v("常用参数")]),s._v(" "),n("th",{staticStyle:{"text-align":"left"}},[s._v("功能")])])]),s._v(" "),n("tbody",[n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("chdir")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("执行命令前先进入到指定目录")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("cmd")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("运行命令指定")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("creates")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("如果文件存在将不运行命令")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("removes")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("如果文件存在将运行命令")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("executable")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("指定执行环境,默认为sh")])])])]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ansible all -m shell -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'chdir=/mnt/ touch file{1..3}'")]),s._v("\nansible all -m shell -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'chdir=/mnt/ ls -ld /mnt'")]),s._v("\nansible all -m shell -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'chdir=/mnt/ ls -lR /mnt'")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("h3",{attrs:{id:"script模块"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#script模块"}},[s._v("#")]),s._v(" script模块")]),s._v(" "),n("p",[s._v("在ansible主机中写好的脚本在受控主机中执行。")]),s._v(" "),n("h3",{attrs:{id:"file模块"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#file模块"}},[s._v("#")]),s._v(" file模块")]),s._v(" "),n("p",[s._v("file模块‌:用于管理文件和目录,包括创建、删除、修改文件属性等操作。例如,设置文件的属主、属组、权限,以及创建空文件或目录‌。")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",{staticStyle:{"text-align":"left"}},[s._v("参数")]),s._v(" "),n("th",{staticStyle:{"text-align":"left"}},[s._v("功能")])])]),s._v(" "),n("tbody",[n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("path")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("指定文件名称")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("state")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("指定操作状态"),n("br"),s._v(" "),n("code",[s._v("touch")]),s._v(":建立"),n("br"),s._v(" "),n("code",[s._v("absent")]),s._v(":删除"),n("br"),s._v(" "),n("code",[s._v("directory")]),s._v(":递归目录"),n("br"),s._v(" "),n("code",[s._v("link")]),s._v(":建立软链接"),n("br"),s._v(" "),n("code",[s._v("hard")]),s._v(":建立硬链接")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("mode")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("设定权限")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("owner")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("设定属主")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("group")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("设定属组")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("src")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("源文件")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("dest")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("目标文件")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("recurse=yes")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("递归更改")])])])]),s._v(" "),n("h3",{attrs:{id:"template模块"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#template模块"}},[s._v("#")]),s._v(" template模块")]),s._v(" "),n("p",[s._v("template模块:从模板生成一个文件并复制到远程主机上。")]),s._v(" "),n("h3",{attrs:{id:"copy模块‌-和-‌fetch模块‌"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#copy模块‌-和-‌fetch模块‌"}},[s._v("#")]),s._v(" copy模块‌ 和 ‌fetch模块‌")]),s._v(" "),n("p",[s._v("copy模块‌:用于从本地复制文件到远程主机。")]),s._v(" "),n("p",[s._v("copy模块参数:")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",{staticStyle:{"text-align":"left"}},[s._v("参数")]),s._v(" "),n("th",{staticStyle:{"text-align":"left"}},[s._v("功能")])])]),s._v(" "),n("tbody",[n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("src")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("源文件")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("dest")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("目的地文件")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("owner")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("指定目的地文件所有人")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("group")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("指定目的地文件所有组")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("mode")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("指定目的地文件权限")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("backup=yes")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("当受控主机中存在文件时备份原文件")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("content")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("指定文本内容直接在受控主机中生成文件")])])])]),s._v(" "),n("p",[s._v("fetch模块‌:用于从远程主机复制文件到本地。fetch模块‌不支持目录。")]),s._v(" "),n("p",[s._v("fetch模块参数:")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",{staticStyle:{"text-align":"left"}},[s._v("参数")]),s._v(" "),n("th",{staticStyle:{"text-align":"left"}},[s._v("功能")])])]),s._v(" "),n("tbody",[n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("src")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("受控主机的源文件")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("dest")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("本机目录")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("flat")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("基本名称功能,单纯只要文件,不要路径的层层目录")])])])]),s._v(" "),n("h3",{attrs:{id:"archive模块‌-和-‌unarchive模块‌"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#archive模块‌-和-‌unarchive模块‌"}},[s._v("#")]),s._v(" archive模块‌ 和 ‌unarchive模块‌")]),s._v(" "),n("p",[s._v("‌archive模块‌ 和 ‌unarchive模块‌:用于压缩和解压缩文件。")]),s._v(" "),n("p",[s._v("archive模块‌参数:")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",{staticStyle:{"text-align":"left"}},[s._v("参数")]),s._v(" "),n("th",{staticStyle:{"text-align":"left"}},[s._v("功能")])])]),s._v(" "),n("tbody",[n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("path")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("打包目录名称")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("dest")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("声称打包文件名称")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("format")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("打包格式")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("owner")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("指定文件所属人")])]),s._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[n("code",[s._v("mode")])]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("指定文件权限")])])])]),s._v(" "),n("p",[s._v("unarchive模块‌参数:")]),s._v(" "),n("h3",{attrs:{id:"其他模块"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#其他模块"}},[s._v("#")]),s._v(" 其他模块")]),s._v(" "),n("ul",[n("li",[s._v("hostname模块‌:用于管理远程主机上的主机名。")]),s._v(" "),n("li",[s._v("‌cron模块‌:用于管理cron任务。")]),s._v(" "),n("li",[s._v("‌yum_repository模块‌ 和 ‌yum(dnf)模块‌:用于管理YUM仓库。")]),s._v(" "),n("li",[s._v("‌service模块‌ 和 ‌firewalld模块‌:分别用于管理服务(启动、停止或者重启一个服务)和防火墙规则。")]),s._v(" "),n("li",[s._v("‌user模块‌ 和 ‌group模块‌:用于管理用户和组。")]),s._v(" "),n("li",[s._v("‌lineinfile模块‌ 和 ‌replace模块‌:用于修改配置文件中的特定行或文本。")]),s._v(" "),n("li",[s._v("‌setup模块‌ 和 ‌debug模块‌:分别用于收集远程主机的信息和进行调试。")])]),s._v(" "),n("h2",{attrs:{id:"ansible的示例"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ansible的示例"}},[s._v("#")]),s._v(" Ansible的示例")]),s._v(" "),n("p",[s._v("在 /etc/ansible/hosts 配置")]),s._v(" "),n("div",{staticClass:"language-ini line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-ini"}},[n("code",[s._v("192.168.1.42\n192.168.1.43\n\n"),n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[s._v("managednodes")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")])]),s._v("\n192.168.1.42\n192.168.1.43\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("p",[s._v("使用 ad-hoc 方式执行命令")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ansible "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".1.42 -m "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v(" -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'hostname'")]),s._v("\nansible managednodes -m shell -a "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'df -lh'")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[s._v("使用 playbook 方式执行命令")]),s._v(" "),n("ol",[n("li",[n("p",[s._v("创建文件 test.yml")]),s._v(" "),n("div",{staticClass:"language-yaml line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-yaml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("---")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" test\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("hosts")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" managednodes\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("tasks")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" hostname\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("command")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" hostname \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" view disk space\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("shell")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" df "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("lh\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])])]),s._v(" "),n("li",[n("p",[s._v("检查语法")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ansible-playbook --syntax-check test.yml\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])])]),s._v(" "),n("li",[n("p",[s._v("执行命令")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ansible-playbook test.yml\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])])])]),s._v(" "),n("h2",{attrs:{id:"python-api"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#python-api"}},[s._v("#")]),s._v(" Python API")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://docs.ansible.com/ansible/2.9/dev_guide/developing_api.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.ansible.com/ansible/2.9/dev_guide/developing_api.html"),n("OutboundLink")],1)]),s._v(" "),n("p",[n("a",{attrs:{href:"https://docs.ansible.com/ansible/latest/dev_guide/developing_api.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.ansible.com/ansible/latest/dev_guide/developing_api.html"),n("OutboundLink")],1)]),s._v(" "),n("h2",{attrs:{id:"参考资料"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#参考资料"}},[s._v("#")]),s._v(" 参考资料")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://docs.ansible.com/ansible/latest/index.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.ansible.com/ansible/latest/index.html"),n("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/19.7d0abc5d.js b/assets/js/19.7d0abc5d.js new file mode 100644 index 00000000..bdec89c6 --- /dev/null +++ b/assets/js/19.7d0abc5d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{613:function(a,s,t){a.exports=t.p+"assets/img/20220120103041.62c7aa90.jpg"},614:function(a,s,t){a.exports=t.p+"assets/img/20220120115815.1d7b67ff.jpg"},615:function(a,s,t){a.exports=t.p+"assets/img/20211009231107.c78f06ad.png"},723:function(a,s,t){"use strict";t.r(s);var e=t(7),n=Object(e.a)({},(function(){var a=this,s=a.$createElement,e=a._self._c||s;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("p",[a._v("在Oracle官网的"),e("a",{attrs:{href:"https://www.oracle.com/java/technologies/downloads/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Java Downloads"),e("OutboundLink")],1),a._v("可以下载最新版本的jdk")]),a._v(" "),e("p",[a._v("在Oracle官网的"),e("a",{attrs:{href:"https://www.oracle.com/java/technologies/downloads/archive/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Java Archive"),e("OutboundLink")],1),a._v("可以下载各种版本的jdk")]),a._v(" "),e("p",[a._v("下载"),e("a",{attrs:{href:"https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html",target:"_blank",rel:"noopener noreferrer"}},[a._v("Java SE 17"),e("OutboundLink")],1)]),a._v(" "),e("p",[a._v("下载"),e("a",{attrs:{href:"https://download.oracle.com/java/17/archive/jdk-17.0.1_windows-x64_bin.zip",target:"_blank",rel:"noopener noreferrer"}},[a._v("Java SE Development Kit 17.0.1 - Windows x64 Compressed Archive"),e("OutboundLink")],1)]),a._v(" "),e("p",[a._v("下载JDK源码:")]),a._v(" "),e("p",[e("a",{attrs:{href:"https://jdk.java.net/",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://jdk.java.net/"),e("OutboundLink")],1)]),a._v(" "),e("p",[e("a",{attrs:{href:"https://jdk.java.net/20/",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://jdk.java.net/20/"),e("OutboundLink")],1)]),a._v(" "),e("h2",{attrs:{id:"windows系统安装jdk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#windows系统安装jdk"}},[a._v("#")]),a._v(" Windows系统安装JDK")]),a._v(" "),e("ol",[e("li",[e("p",[a._v("下载["),e("a",{attrs:{href:"https://www.oracle.com/java/technologies/downloads/#license-lightbox",target:"_blank",rel:"noopener noreferrer"}},[a._v("jdk-8u321-windows-x64.exe"),e("OutboundLink")],1),a._v("]")]),a._v(" "),e("p",[e("img",{attrs:{src:t(613),alt:""}})])]),a._v(" "),e("li",[e("p",[a._v("双击运行,安装到指定路径")])]),a._v(" "),e("li",[e("p",[a._v("配置环境变量")])])]),a._v(" "),e("p",[a._v("​\t\t3.1 新建 JAVA_HOME 环境变量,指向JDK安装目录")]),a._v(" "),e("p",[a._v("​\t\t3.2 编辑 Path 环境变量,添加 %JAVA_HOME%\\bin")]),a._v(" "),e("p",[a._v("​\t\t3.3 如果是 JDK8 ,Path环境变量需要添加 %JAVA_HOME%\\bin 和 %JAVA_HOME%\\jre\\bin")]),a._v(" "),e("h2",{attrs:{id:"linux系统安装jdk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#linux系统安装jdk"}},[a._v("#")]),a._v(" Linux系统安装JDK")]),a._v(" "),e("p",[e("a",{attrs:{href:"https://www.oracle.com/java/technologies/downloads/",target:"_blank",rel:"noopener noreferrer"}},[a._v("下载JDK"),e("OutboundLink")],1)]),a._v(" "),e("p",[e("img",{attrs:{src:t(614),alt:""}})]),a._v(" "),e("p",[a._v("卸载已安装的JDK")]),a._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# 查询使用rpm命令安装的JDK")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rpm")]),a._v(" -qa "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("grep")]),a._v(" jdk\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# 卸载使用rpm命令安装的JDK")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rpm")]),a._v(" -e --nodeps java-1.7.0-openjdk-headless-1.7.0.261-2.6.22.2.el7_8.x86_64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rpm")]),a._v(" -e --nodeps copy-jdk-configs-3.3-10.el7_5.noarch\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rpm")]),a._v(" -e --nodeps java-1.8.0-openjdk-headless-1.8.0.262.b10-1.el7.x86_64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rpm")]),a._v(" -e --nodeps java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rpm")]),a._v(" -e --nodeps java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# 查询使用tar命令安装的JDK")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("which")]),a._v(" java\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# 卸载使用tar命令安装的JDK")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rm")]),a._v(" -rf /usr/local/jdk1.8.0_321/\n")])]),a._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[a._v("1")]),e("br"),e("span",{staticClass:"line-number"},[a._v("2")]),e("br"),e("span",{staticClass:"line-number"},[a._v("3")]),e("br"),e("span",{staticClass:"line-number"},[a._v("4")]),e("br"),e("span",{staticClass:"line-number"},[a._v("5")]),e("br"),e("span",{staticClass:"line-number"},[a._v("6")]),e("br"),e("span",{staticClass:"line-number"},[a._v("7")]),e("br"),e("span",{staticClass:"line-number"},[a._v("8")]),e("br"),e("span",{staticClass:"line-number"},[a._v("9")]),e("br"),e("span",{staticClass:"line-number"},[a._v("10")]),e("br"),e("span",{staticClass:"line-number"},[a._v("11")]),e("br"),e("span",{staticClass:"line-number"},[a._v("12")]),e("br"),e("span",{staticClass:"line-number"},[a._v("13")]),e("br")])]),e("p",[a._v("使用rpm命令安装jdk")]),a._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("rpm")]),a._v(" -ivh jdk-8u321-linux-x64.rpm\n")])]),a._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[a._v("1")]),e("br")])]),e("p",[a._v("使用tar命令安装jdk")]),a._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("tar")]),a._v(" -zxvf jdk-8u321-linux-x64.tar.gz\n")])]),a._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[a._v("1")]),e("br")])]),e("p",[a._v("配置环境变量 "),e("code",[a._v("vi /etc/profile")]),a._v(" 添加以下内容")]),a._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("JAVA_HOME=/usr/local/jdk1.8.0_321\nCLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib\nPATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin\nexport PATH CLASSPATH JAVA_HOME\n")])]),a._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[a._v("1")]),e("br"),e("span",{staticClass:"line-number"},[a._v("2")]),e("br"),e("span",{staticClass:"line-number"},[a._v("3")]),e("br"),e("span",{staticClass:"line-number"},[a._v("4")]),e("br")])]),e("p",[a._v("使环境变量立即生效")]),a._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("source")]),a._v(" /etc/profile\n")])]),a._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[a._v("1")]),e("br")])]),e("h2",{attrs:{id:"同一台电脑配置多版本jdk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#同一台电脑配置多版本jdk"}},[a._v("#")]),a._v(" 同一台电脑配置多版本JDK")]),a._v(" "),e("p",[a._v("多版本JDK,配置 JAVA_8_HOME、JAVA_17_HOME,将 JAVA_HOME 指向 %JAVA_X_HOME%")]),a._v(" "),e("p",[a._v("执行 java -version 结果可能不是我们预期的,这是因为在 JDK 安装时会自动将 Java.exe,javaw.exe,javaws.exe 复制到 C 盘,可以在 cmd 中使用 where java 查看它们的位置并删除,然后重新打开一个cmd,执行 java -version")]),a._v(" "),e("img",{attrs:{src:t(615)}}),a._v(" "),e("h2",{attrs:{id:"查看系统是否安装jdk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#查看系统是否安装jdk"}},[a._v("#")]),a._v(" 查看系统是否安装JDK")]),a._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("root@java jdk1.8.0_321"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),e("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# java -version")]),a._v("\njava version "),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"1.8.0_321"')]),a._v("\nJava"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("TM"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" SE Runtime Environment "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("build "),e("span",{pre:!0,attrs:{class:"token number"}},[a._v("1.8")]),a._v(".0_321-b07"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v("\nJava HotSpot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("TM"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[a._v("64")]),a._v("-Bit Server VM "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),a._v("build "),e("span",{pre:!0,attrs:{class:"token number"}},[a._v("25.321")]),a._v("-b07, mixed mode"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v("\n\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("[")]),a._v("root@java jdk1.8.0_321"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("]")]),e("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# whereis java")]),a._v("\njava: /usr/local/jdk1.8.0_321/bin/java /usr/local/jdk1.8.0_321/jre/bin/java\n")])]),a._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[a._v("1")]),e("br"),e("span",{staticClass:"line-number"},[a._v("2")]),e("br"),e("span",{staticClass:"line-number"},[a._v("3")]),e("br"),e("span",{staticClass:"line-number"},[a._v("4")]),e("br"),e("span",{staticClass:"line-number"},[a._v("5")]),e("br"),e("span",{staticClass:"line-number"},[a._v("6")]),e("br"),e("span",{staticClass:"line-number"},[a._v("7")]),e("br")])]),e("h2",{attrs:{id:"命令行窗口配置临时jdk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#命令行窗口配置临时jdk"}},[a._v("#")]),a._v(" 命令行窗口配置临时JDK")]),a._v(" "),e("div",{staticClass:"language-powershell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-powershell"}},[e("code",[a._v("path D:\\Java\\jdk"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("-")]),a._v("11"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("0"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("13\\bin"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(";")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("%")]),a._v("path"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("%")]),a._v("\n")])]),a._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[a._v("1")]),e("br")])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/20.5b9ff54f.js b/assets/js/20.5b9ff54f.js new file mode 100644 index 00000000..f02e3615 --- /dev/null +++ b/assets/js/20.5b9ff54f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{649:function(s,t,n){s.exports=n.p+"assets/img/20210324135135.596fb983.png"},650:function(s,t,n){s.exports=n.p+"assets/img/20210324161309.7d47562d.png"},651:function(s,t,n){s.exports=n.p+"assets/img/20210324161327.68585584.png"},746:function(s,t,n){"use strict";n.r(t);var a=n(7),e=Object(a.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h2",{attrs:{id:"zookeeper-简介"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#zookeeper-简介"}},[s._v("#")]),s._v(" zookeeper 简介")]),s._v(" "),a("p",[a("strong",[s._v("zookeeper")]),s._v(",基于"),a("strong",[s._v("观察者模式")]),s._v("设计的"),a("strong",[s._v("分布式协调框架")]),s._v(",负责存储和管理大家关心的数据,核心是"),a("strong",[s._v("文件系统+通知机制")]),s._v("。")]),s._v(" "),a("p",[s._v("zookeeper有几个重要的概念:")]),s._v(" "),a("p",[a("strong",[s._v("数据结构")]),s._v(":文件系统的数据结构,每个节点称为一个ZNode,每个ZNode通过其路径进行唯一标识,默认能够存储1M数据。")]),s._v(" "),a("img",{attrs:{src:n(649)}}),s._v(" "),a("p",[a("strong",[s._v("节点类型")]),s._v(":持久节点、临时节点、顺序节点。")]),s._v(" "),a("p",[a("strong",[s._v("工作状态")]),s._v(":")]),s._v(" "),a("ul",[a("li",[s._v("LOOKING:竞选状态。寻找Leader中")]),s._v(" "),a("li",[s._v("FOLLOWING:跟从状态。当前服务器角色是Follower")]),s._v(" "),a("li",[s._v("LEADING:领导状态。当前服务器角色是Leader")]),s._v(" "),a("li",[s._v("OBSERVING:观察状态。当前服务器角色是Observer")])]),s._v(" "),a("p",[a("strong",[s._v("选举机制")]),s._v(":全新集群选举和非全新集群选举")]),s._v(" "),a("p",[s._v("全新集群选举,是指服务器集群首次启动时的选举,服务器能否成为Leader跟myid的数值有关,遵循"),a("strong",[s._v("过半机制")]),s._v("。")]),s._v(" "),a("p",[s._v("非全新集群选举,是指服务器集群在运行期间,如果Leader宕机了,Follower重新选举Leader。依次比较逻辑时钟(选举次数)、数据ID(反应保存数据的新旧程度)、服务器ID(myid)。")]),s._v(" "),a("p",[a("strong",[s._v("写入数据")]),s._v(":同样遵循“"),a("strong",[s._v("过半机制")]),s._v("”。任意一台服务器收到客户端写请求,都会将写请求转发给Leader,由Leader发起写提议,接着Leader和Follower们进行写操作,Follower写完后将结果返回Leader,如果超过一半机器写成功,则Leader认为写成功,并且将结果知会转发请求的源机器,源机器再返回客户端。")]),s._v(" "),a("p",[a("strong",[s._v("监听原理")]),s._v(":主线程(Main)创建ZK客户端,这时会创建两个线程,一个线程负责网络连接通信(connet),两个线程负责监听(listener)。通过connet将注册的监听事件发给ZK,ZK监听到数据或路径有变化时通知listener,listener调用process方法。")]),s._v(" "),a("h2",{attrs:{id:"zookeeper-安装部署"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#zookeeper-安装部署"}},[s._v("#")]),s._v(" zookeeper 安装部署")]),s._v(" "),a("p",[s._v("zookeeper安装部署比较简单。将压缩包解压,然后修改下配置文件即可,配置文件需要将 "),a("code",[s._v("conf/zoo_sample.cfg")]),s._v("复制并重命名为 "),a("code",[s._v("conf/zoo.cfg")]),s._v(" 。")]),s._v(" "),a("p",[s._v("安装部署有三种方式:本地模式(单机)、伪分布式模式(单机不同端口)、分布式模式。")]),s._v(" "),a("blockquote",[a("p",[a("strong",[s._v("本地模式安装部署")])])]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解压安装包")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -zxf apache-zookeeper-3.6.2-bin.tar.gz\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 进入解压目录")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" apache-zookeeper-3.6.2-bin\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 创建数据目录")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" data\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 进入配置目录")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" conf\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 复制配置文件")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" zoo_sample.cfg zoo.cfg\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 修改配置文件")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("vi")]),s._v(" zoo.cfg\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br")])]),a("p",[s._v("zoo.cfg")]),s._v(" "),a("div",{staticClass:"language-properties line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-properties"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The number of milliseconds of each tick")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 通信心跳数,单位毫秒。用于心跳机制,服务器之间或服务器与客户端之间维持心跳的时间间隔")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("tickTime")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("2000")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The number of ticks that the initial ")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# synchronization phase can take")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 集群中LF初始连接时的通信时限 = tickTime * initLimit")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("initLimit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("10")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The number of ticks that can pass between ")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# sending a request and getting an acknowledgement")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 集群中LF最大同步通信时限 = tickTime * syncLimit")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("syncLimit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("5")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# the directory where the snapshot is stored.")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# do not use /tmp for storage, /tmp here is just ")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# example sakes.")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 数据快照存储目录")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("dataDir")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("/opt/zookeeper/apache-zookeeper-3.6.2-bin/data")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# the port at which the clients will connect")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 客户端连接端口")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("clientPort")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("2181")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# the maximum number of client connections.")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# increase this if you need to handle more clients")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#maxClientCnxns=60")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Be sure to read the maintenance section of the ")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# administrator guide before turning on autopurge.")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# The number of snapshots to retain in dataDir")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#autopurge.snapRetainCount=3")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Purge task interval in hours")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# Set to "0" to disable auto purge feature')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#autopurge.purgeInterval=1")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("## Metrics Providers")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# https://prometheus.io Metrics Exporter")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#metricsProvider.httpPort=7000")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br")])]),a("blockquote",[a("p",[a("strong",[s._v("分布式模式安装部署")]),s._v(",集群模式服务器数量一般是奇数!")])]),s._v(" "),a("p",[s._v("在 "),a("code",[s._v("dataDir=/opt/zookeeper/apache-zookeeper-3.6.2-bin/data")]),s._v("目录下新建文件 "),a("code",[s._v("myid")]),s._v(",并写入一个数字。该数字用于"),a("strong",[s._v("选举机制")]),s._v(",一般来说,数字越大的,成为Leader的概率越高。")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /opt/zookeeper/apache-zookeeper-3.6.2-bin/data\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("touch")]),s._v(" myid\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("vi")]),s._v(" myid\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br")])]),a("p",[s._v("修改 "),a("code",[s._v("zoo.cfg")]),s._v(" 增加如下内容:")]),s._v(" "),a("div",{staticClass:"language-properties line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-properties"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 集群配置,格式:server.A=B:C:D")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# A表示myid里面的数字")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# B表示服务器ip")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# C表示LF交换信息的端口号")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# D表示L宕机了,F们需要重新选举时通信的端口号")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("server.1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("192.168.66.133:2888:3888")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("server.2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("192.168.66.134:2888:3888")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("server.3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("192.168.66.135:2888:3888")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("p",[s._v("建立主机与IP之间的映射关系")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /etc/hosts\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("div",{staticClass:"language- line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[s._v("127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 192.168.66.134\n::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.66.134\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("blockquote",[a("p",[s._v("配置集群时,记得建立主机与IP之间的映射关系,并关闭防火墙或者开放对应端口号!!!")])]),s._v(" "),a("img",{attrs:{src:n(650)}}),s._v(" "),a("img",{attrs:{src:n(651)}}),s._v(" "),a("h2",{attrs:{id:"zookeeper-基本操作"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#zookeeper-基本操作"}},[s._v("#")]),s._v(" zookeeper 基本操作")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" bin\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看状态")]),s._v("\n./zkServer.sh status\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动服务")]),s._v("\n./zkServer.sh start\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重启服务")]),s._v("\n./zkServer.sh restart\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 停止服务")]),s._v("\n./zkServer.sh stop\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 连接客户端")]),s._v("\n./zkCli.sh\n./zkCli.sh -server ip:port\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 退出客户端")]),s._v("\nquit\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 创建节点")]),s._v("\ncreate "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-e"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-c"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-t ttl"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" path "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("acl"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 修改节点")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-v version"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" path data\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除节点")]),s._v("\ndelete "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-v version"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" path\ndeleteall path "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-b batch size"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 获取节点")]),s._v("\nget "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-w"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" path\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 列出节点")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ls")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-w"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-R"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" path\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br")])]),a("h2",{attrs:{id:"参考资料"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#参考资料"}},[s._v("#")]),s._v(" 参考资料")]),s._v(" "),a("p",[a("a",{attrs:{href:"https://zookeeper.apache.org/",target:"_blank",rel:"noopener noreferrer"}},[s._v("zookeeper官网"),a("OutboundLink")],1)]),s._v(" "),a("p",[a("a",{attrs:{href:"https://www.w3cschool.cn/zookeeper/",target:"_blank",rel:"noopener noreferrer"}},[s._v("w3cschool - Zookeeper 教程"),a("OutboundLink")],1)]),s._v(" "),a("p",[a("a",{attrs:{href:"https://www.bilibili.com/video/BV1PW411r7iP",target:"_blank",rel:"noopener noreferrer"}},[s._v("尚硅谷Zookeeper教程(zookeeper框架精讲)"),a("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/21.9791fb1c.js b/assets/js/21.9791fb1c.js new file mode 100644 index 00000000..5f86fe71 --- /dev/null +++ b/assets/js/21.9791fb1c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{654:function(e,t,a){e.exports=a.p+"assets/img/20240110223509.00d1996f.png"},655:function(e,t,a){e.exports=a.p+"assets/img/cucumber-plugin.4c83f438.png"},656:function(e,t,a){e.exports=a.p+"assets/img/add-cucumber-library.ca1b131f.png"},753:function(e,t,a){"use strict";a.r(t);var r=a(7),s=Object(r.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h2",{attrs:{id:"cucumber"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#cucumber"}},[e._v("#")]),e._v(" Cucumber")]),e._v(" "),r("p",[r("a",{attrs:{href:"https://cucumber.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Cucumber"),r("OutboundLink")],1),e._v(" is a testing framework that supports "),r("a",{attrs:{href:"http://en.wikipedia.org/wiki/Behavior-driven_development",target:"_blank",rel:"noopener noreferrer"}},[e._v("behavior-driven development"),r("OutboundLink")],1),e._v(" and allows you to write features and scenarios in a human-readable language.")]),e._v(" "),r("p",[e._v("Cucumber是一个用于行为驱动开发behavior-driven development(BDD)的自动化测试工具,用Ruby编写,使用自然语言来描述测试用例,使得非研发(QA、PM)也可以理解甚至编写测试用例。")]),e._v(" "),r("h2",{attrs:{id:"gherkin"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#gherkin"}},[e._v("#")]),e._v(" Gherkin")]),e._v(" "),r("p",[e._v("Gherkin is a set of grammar rules that makes plain text structured enough for Cucumber to\nunderstand.")]),e._v(" "),r("p",[e._v("Gherkin 是 Cucumber 用来描述 测试用例 的语言,以下为关键字的用意与关联关系。")]),e._v(" "),r("img",{attrs:{src:a(654)}}),e._v(" "),r("h3",{attrs:{id:"step-definitions"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#step-definitions"}},[e._v("#")]),e._v(" Step Definitions")]),e._v(" "),r("p",[e._v("Step definitions connect Gherkin steps to programming code.")]),e._v(" "),r("h3",{attrs:{id:"keywords"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#keywords"}},[e._v("#")]),e._v(" Keywords")]),e._v(" "),r("p",[e._v("The primary keywords are:")]),e._v(" "),r("ul",[r("li",[r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#feature",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("Feature")]),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#rule",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("Rule")]),r("OutboundLink")],1),e._v(" (as of Gherkin 6)")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#example",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("Example")]),r("OutboundLink")],1),e._v(" (or "),r("code",[e._v("Scenario")]),e._v(")")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#given",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("Given")]),r("OutboundLink")],1),e._v(", "),r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#when",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("When")]),r("OutboundLink")],1),e._v(", "),r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#then",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("Then")]),r("OutboundLink")],1),e._v(", "),r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#and-but",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("And")]),r("OutboundLink")],1),e._v(", "),r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#and-but",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("But")]),r("OutboundLink")],1),e._v("\nfor steps (or "),r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#Asterisk",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("*")]),r("OutboundLink")],1),e._v(")")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#background",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("Background")]),r("OutboundLink")],1)]),e._v(" "),r("li",[r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#scenario-outline",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("Scenario Outline")]),r("OutboundLink")],1),e._v(" (\nor "),r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#scenario-outline",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("Scenario Template")]),r("OutboundLink")],1),e._v(")")]),e._v(" "),r("li",[r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#examples",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("Examples")]),r("OutboundLink")],1),e._v(" (\nor "),r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#examples",target:"_blank",rel:"noopener noreferrer"}},[r("code",[e._v("Scenarios")]),r("OutboundLink")],1),e._v(")")])]),e._v(" "),r("p",[e._v("There are a few secondary keywords as well:")]),e._v(" "),r("ul",[r("li",[r("code",[e._v('"""')]),e._v(" (Doc Strings)")]),e._v(" "),r("li",[r("code",[e._v("|")]),e._v(" (Data Tables)")]),e._v(" "),r("li",[r("code",[e._v("@")]),e._v(" (Tags)")]),e._v(" "),r("li",[r("code",[e._v("#")]),e._v(" (Comments)")])]),e._v(" "),r("h4",{attrs:{id:"feature"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#feature"}},[e._v("#")]),e._v(" Feature")]),e._v(" "),r("p",[e._v("The purpose of the "),r("code",[e._v("Feature")]),e._v(" keyword is to provide a high-level description of a software feature,\nand to group related scenarios.")]),e._v(" "),r("p",[e._v("The first primary keyword in a Gherkin document must always be "),r("code",[e._v("Feature")]),e._v(", followed by a "),r("code",[e._v(":")]),e._v(" and a\nshort text that describes the feature.")]),e._v(" "),r("p",[e._v("You can add free-form text underneath "),r("code",[e._v("Feature")]),e._v(" to add more description.")]),e._v(" "),r("p",[e._v("These description lines are ignored by Cucumber at runtime, but are available for reporting (they\nare included by reporting tools like the official HTML formatter).")]),e._v(" "),r("p",[e._v("Free-form descriptions (as described above for "),r("code",[e._v("Feature")]),e._v(") can also be placed\nunderneath "),r("code",[e._v("Example")]),e._v("/"),r("code",[e._v("Scenario")]),e._v(", "),r("code",[e._v("Background")]),e._v(", "),r("code",[e._v("Scenario Outline")]),e._v(" and "),r("code",[e._v("Rule")]),e._v(".")]),e._v(" "),r("p",[e._v("You can write anything you like, as long as no line starts with a keyword.")]),e._v(" "),r("p",[e._v("Descriptions can be in the form of Markdown - formatters including the official HTML formatter\nsupport this.")]),e._v(" "),r("h4",{attrs:{id:"rule"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#rule"}},[e._v("#")]),e._v(" Rule")]),e._v(" "),r("p",[e._v("The (optional) "),r("code",[e._v("Rule")]),e._v(" keyword has been part of Gherkin since v6.")]),e._v(" "),r("p",[e._v("The purpose of the "),r("code",[e._v("Rule")]),e._v(" keyword is to represent one "),r("em",[e._v("business rule")]),e._v(" that should be implemented. It\nprovides additional information for a feature. A "),r("code",[e._v("Rule")]),e._v(" is used to group together several scenarios\nthat belong to this "),r("em",[e._v("business rule")]),e._v(". A "),r("code",[e._v("Rule")]),e._v(" should contain one or more scenarios that illustrate\nthe particular rule.")]),e._v(" "),r("h4",{attrs:{id:"example-or-scenario"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#example-or-scenario"}},[e._v("#")]),e._v(" Example (or Scenario)")]),e._v(" "),r("p",[e._v("This is a "),r("em",[e._v("concrete example")]),e._v(" that "),r("em",[e._v("illustrates")]),e._v(" a business rule. It consists of a list\nof "),r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/#steps",target:"_blank",rel:"noopener noreferrer"}},[e._v("steps"),r("OutboundLink")],1),e._v(".")]),e._v(" "),r("p",[e._v("The keyword "),r("code",[e._v("Scenario")]),e._v(" is a synonym of the keyword "),r("code",[e._v("Example")]),e._v(".")]),e._v(" "),r("p",[e._v("You can have as many steps as you like, but we recommend 3-5 steps per example. Having too many\nsteps will cause the example to lose its expressive power as a specification and documentation.")]),e._v(" "),r("p",[e._v("In addition to being a specification and documentation, an example is also a "),r("em",[e._v("test")]),e._v(". As a whole,\nyour examples are an "),r("em",[e._v("executable specification")]),e._v(" of the system.")]),e._v(" "),r("p",[e._v("Examples follow this same pattern:")]),e._v(" "),r("ul",[r("li",[e._v("Describe an initial context ("),r("code",[e._v("Given")]),e._v(" steps)")]),e._v(" "),r("li",[e._v("Describe an event ("),r("code",[e._v("When")]),e._v(" steps)")]),e._v(" "),r("li",[e._v("Describe an expected outcome ("),r("code",[e._v("Then")]),e._v(" steps)")])]),e._v(" "),r("h4",{attrs:{id:"steps"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#steps"}},[e._v("#")]),e._v(" Steps")]),e._v(" "),r("p",[e._v("Each step starts with "),r("code",[e._v("Given")]),e._v(", "),r("code",[e._v("When")]),e._v(", "),r("code",[e._v("Then")]),e._v(", "),r("code",[e._v("And")]),e._v(", or "),r("code",[e._v("But")]),e._v(".")]),e._v(" "),r("p",[e._v("Cucumber executes each step in a scenario one at a time, in the sequence you’ve written them in.\nWhen Cucumber tries to execute a step, it looks for a matching step definition to execute.")]),e._v(" "),r("p",[e._v("Keywords are not taken into account when looking for a step definition. This means you cannot have\na "),r("code",[e._v("Given")]),e._v(", "),r("code",[e._v("When")]),e._v(", "),r("code",[e._v("Then")]),e._v(", "),r("code",[e._v("And")]),e._v(" or "),r("code",[e._v("But")]),e._v(" step with the same text as another step.")]),e._v(" "),r("h4",{attrs:{id:"background"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#background"}},[e._v("#")]),e._v(" Background")]),e._v(" "),r("p",[e._v("Occasionally you’ll find yourself repeating the same "),r("code",[e._v("Given")]),e._v(" steps in all of the scenarios in\na "),r("code",[e._v("Feature")]),e._v(".")]),e._v(" "),r("p",[e._v("Since it is repeated in every scenario, this is an indication that those steps are not "),r("em",[e._v("essential")]),e._v("\nto describe the scenarios; they are "),r("em",[e._v("incidental details")]),e._v(". You can literally move such "),r("code",[e._v("Given")]),e._v(" steps\nto the background, by grouping them under a "),r("code",[e._v("Background")]),e._v(" section.")]),e._v(" "),r("p",[e._v("A "),r("code",[e._v("Background")]),e._v(" allows you to add some context to the scenarios that follow it. It can contain one or\nmore "),r("code",[e._v("Given")]),e._v(" steps, which are run before "),r("em",[e._v("each")]),e._v(" scenario, but after\nany "),r("a",{attrs:{href:"https://docs.cucumber.io/docs/cucumber/api/#hooks",target:"_blank",rel:"noopener noreferrer"}},[e._v("Before hooks"),r("OutboundLink")],1),e._v(".")]),e._v(" "),r("p",[e._v("A "),r("code",[e._v("Background")]),e._v(" is placed before the first "),r("code",[e._v("Scenario")]),e._v("/"),r("code",[e._v("Example")]),e._v(", at the same level of indentation.")]),e._v(" "),r("h4",{attrs:{id:"scenario-outline"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#scenario-outline"}},[e._v("#")]),e._v(" Scenario Outline")]),e._v(" "),r("p",[e._v("The "),r("code",[e._v("Scenario Outline")]),e._v(" keyword can be used to run the same "),r("code",[e._v("Scenario")]),e._v(" multiple times, with different\ncombinations of values.")]),e._v(" "),r("p",[e._v("The keyword "),r("code",[e._v("Scenario Template")]),e._v(" is a synonym of the keyword "),r("code",[e._v("Scenario Outline")]),e._v(".")]),e._v(" "),r("h3",{attrs:{id:"step-arguments"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#step-arguments"}},[e._v("#")]),e._v(" Step Arguments")]),e._v(" "),r("h4",{attrs:{id:"cucumber-expressions"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#cucumber-expressions"}},[e._v("#")]),e._v(" Cucumber Expressions")]),e._v(" "),r("p",[e._v("Cucumber supports\nboth "),r("a",{attrs:{href:"https://github.com/cucumber/cucumber-expressions#readme",target:"_blank",rel:"noopener noreferrer"}},[e._v("Cucumber Expressions"),r("OutboundLink")],1),e._v(" and Regular\nExpressionsfor defining "),r("a",{attrs:{href:"https://cucumber.io/docs/cucumber/step-definitions",target:"_blank",rel:"noopener noreferrer"}},[e._v("Step Definitions"),r("OutboundLink")],1),e._v(", but\nyou cannot mix Cucumber Expression syntax with Regular Expression syntax in the same expression.")]),e._v(" "),r("p",[e._v("Cucumber 支持在 Java 注解 中使用 {类型} 作为占位符。")]),e._v(" "),r("p",[e._v("在 Step 中直接写上参数,将在 Java 代码中,会把占位符对应的参数作为方法参数传递进去。")]),e._v(" "),r("p",[e._v("注解中声明占位符的顺序为注入方法参数的顺序。")]),e._v(" "),r("p",[e._v("字串类型的关键字,需要加上单引号或 双引号 作为声明。")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("类型")]),e._v(" "),r("th",[e._v("正则")]),e._v(" "),r("th",[e._v("说明")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("{byte}")]),e._v(" "),r("td",[e._v("(/\\d+/)"),r("br"),e._v("(/[0-9]+/)")]),e._v(" "),r("td",[e._v("Matches the same as "),r("code",[e._v("{int}")]),e._v(", "),r("br"),e._v("but converts to an 8 bit signed integer if the platform supports it.")])]),e._v(" "),r("tr",[r("td",[e._v("{short}")]),e._v(" "),r("td",[e._v("(/\\d+/)"),r("br"),e._v("(/[0-9]+/)")]),e._v(" "),r("td",[e._v("Matches the same as "),r("code",[e._v("{int}")]),e._v(", "),r("br"),e._v("but converts to a 16 bit signed integer if the platform supports it.")])]),e._v(" "),r("tr",[r("td",[e._v("{int}")]),e._v(" "),r("td",[e._v("(/\\d+/)"),r("br"),e._v("(/[0-9]+/)")]),e._v(" "),r("td",[e._v("Matches integers")])]),e._v(" "),r("tr",[r("td",[e._v("{long}")]),e._v(" "),r("td",[e._v("(/\\d+/)"),r("br"),e._v("(/[0-9]+/)")]),e._v(" "),r("td",[e._v("Matches the same as "),r("code",[e._v("{int}")]),e._v(", "),r("br"),e._v("but converts to a 64 bit signed integer if the platform supports it.")])]),e._v(" "),r("tr",[r("td",[e._v("{float}")]),e._v(" "),r("td",[e._v("(/-?\\d+.\\d+/)"),r("br"),e._v("(/-?[0-9]+.[0-9]+/)")]),e._v(" "),r("td",[e._v("Matches floats")])]),e._v(" "),r("tr",[r("td",[e._v("{double}")]),e._v(" "),r("td",[e._v("(/-?\\d+.\\d+/)"),r("br"),e._v("(/-?[0-9]+.[0-9]+/)")]),e._v(" "),r("td",[e._v("Matches the same as "),r("code",[e._v("{float}")]),e._v(", "),r("br"),e._v("but converts to a 64 bit float if the platform supports it.")])]),e._v(" "),r("tr",[r("td",[e._v("{biginteger}")]),e._v(" "),r("td",[e._v("(/\\d+/)"),r("br"),e._v("(/[0-9]+/)")]),e._v(" "),r("td",[e._v("Matches the same as "),r("code",[e._v("{int}")]),e._v(", "),r("br"),e._v("but converts to a "),r("code",[e._v("BigInteger")]),e._v(" if the platform supports it.")])]),e._v(" "),r("tr",[r("td",[e._v("{bigdecimal}")]),e._v(" "),r("td",[e._v("(/-?\\d+.\\d+/)"),r("br"),e._v("(/-?[0-9]+.[0-9]+/)")]),e._v(" "),r("td",[e._v("Matches the same as {float}, "),r("br"),e._v("but converts to a BigDecimal if the platform supports it.")])]),e._v(" "),r("tr",[r("td",[e._v("{string}")]),e._v(" "),r("td",[e._v('(/".*"/)')]),e._v(" "),r("td",[e._v("Matches single-quoted or double-quoted strings."),r("br"),e._v("Only the text between the quotes will be extracted. "),r("br"),e._v("The quotes themselves are discarded. "),r("br"),e._v("Empty pairs of quotes are valid "),r("br"),e._v("and will be matched and passed to step code as empty strings.")])]),e._v(" "),r("tr",[r("td",[e._v("{word}")]),e._v(" "),r("td",[e._v("(/\\S+/)")]),e._v(" "),r("td",[e._v("Matches words without whitespace")])]),e._v(" "),r("tr",[r("td",[r("code",[e._v("{}")])]),e._v(" "),r("td",[e._v("(/.*/)")]),e._v(" "),r("td",[e._v("Anonymous, Matches anything ("),r("code",[e._v("/.*/")]),e._v(").")])])])]),e._v(" "),r("h2",{attrs:{id:"hook"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#hook"}},[e._v("#")]),e._v(" Hook")]),e._v(" "),r("p",[e._v("Hook:钩子方法")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("注解")]),e._v(" "),r("th",[e._v("执行时机")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("@BeforeAll")]),e._v(" "),r("td",[e._v("在启动 Cucumber 时执行")])]),e._v(" "),r("tr",[r("td",[e._v("@Before")]),e._v(" "),r("td",[e._v("在所有 Scenario 执行之前执行")])]),e._v(" "),r("tr",[r("td",[e._v("@BeforeStep")]),e._v(" "),r("td",[e._v("在所有 Step 执行之前执行")])]),e._v(" "),r("tr",[r("td",[e._v("@AfterStep")]),e._v(" "),r("td",[e._v("在所有 Step 执行之后执行")])]),e._v(" "),r("tr",[r("td",[e._v("@After")]),e._v(" "),r("td",[e._v("在所有 Scenario 执行之后执行")])]),e._v(" "),r("tr",[r("td",[e._v("@AfterAll")]),e._v(" "),r("td",[e._v("在结束 Cucumber 时执行")])])])]),e._v(" "),r("h2",{attrs:{id:"idea-cucumber-support"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#idea-cucumber-support"}},[e._v("#")]),e._v(" IDEA cucumber support")]),e._v(" "),r("p",[e._v("To be able to use Cucumber in your application, make sure that the necessary plugins are enabled and add the Cucumber library to your project.")]),e._v(" "),r("p",[e._v("Refer to "),r("a",{attrs:{href:"https://www.jetbrains.com/help/idea/2023.3/enabling-cucumber-support-in-project.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.jetbrains.com/help/idea/2023.3/enabling-cucumber-support-in-project.html"),r("OutboundLink")],1)]),e._v(" "),r("h3",{attrs:{id:"enable-plugins"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#enable-plugins"}},[e._v("#")]),e._v(" Enable plugins")]),e._v(" "),r("p",[e._v("In IntelliJ Ultimate, the required plugins are bundled and enabled by default. However, we recommend you to make sure that they are switched on.")]),e._v(" "),r("p",[e._v("In IntelliJ Community, the necessary plugins are not bundled, that is why you need to install and enable them.")]),e._v(" "),r("ol",[r("li",[e._v("Press CtrlAlt0S to open the IDE settings and then select Plugins.")]),e._v(" "),r("li",[e._v("Switch to the Installed tab and make sure that the following plugins are enabled (the plugins must be enabled in the specified order):\n"),r("ul",[r("li",[e._v("Gherkin")]),e._v(" "),r("li",[e._v("Cucumber for Java")]),e._v(" "),r("li",[e._v("Cucumber for Groovy (optional: install this plugin if you want to create "),r("a",{attrs:{href:"https://www.jetbrains.com/help/idea/2023.3/creating-step-definition.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("step definitions"),r("OutboundLink")],1),e._v(" in Groovy)")])])]),e._v(" "),r("li",[e._v("If the plugins are not installed, switch to the Marketplace tab, type their names in the search field in the specified order, and click Install next to each of them.")]),e._v(" "),r("li",[e._v("Apply the changes and close the dialog. Restart the IDE if prompted.")])]),e._v(" "),r("p",[r("img",{attrs:{src:a(655),alt:""}})]),e._v(" "),r("h3",{attrs:{id:"add-the-cucumber-library"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#add-the-cucumber-library"}},[e._v("#")]),e._v(" Add the Cucumber library")]),e._v(" "),r("h4",{attrs:{id:"intellij-idea-projects"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#intellij-idea-projects"}},[e._v("#")]),e._v(" IntelliJ IDEA projects")]),e._v(" "),r("p",[e._v("Follow these steps to add a library if you're building your project with the native IntelliJ IDEA builder:")]),e._v(" "),r("ol",[r("li",[r("p",[e._v("In the main menu, go to File | Project Structure (CtrlAltShift0S).")])]),e._v(" "),r("li",[r("p",[e._v("Under Project Settings, select Libraries and click "),r("img",{attrs:{src:"https://resources.jetbrains.com/help/img/idea/2023.3/app.expui.general.add.svg",alt:"the New Project Library button"}}),e._v(" | From Maven.")])]),e._v(" "),r("li",[r("p",[e._v("In the dialog that opens, specify the artifact of the library version that you want to use in your project, for example: "),r("code",[e._v("io.cucumber:cucumber-java:jar:6.1.1")]),e._v(" or "),r("code",[e._v("io.cucumber:cucumber-java8:jar:6.1.1")]),e._v(" (if you want to use lambda expressions in step definitions).")]),e._v(" "),r("p",[e._v("Click OK.")])]),e._v(" "),r("li",[r("p",[e._v("Apply the changes and close the dialog.")])])]),e._v(" "),r("p",[r("img",{attrs:{src:a(656),alt:""}})]),e._v(" "),r("h4",{attrs:{id:"maven-projects"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#maven-projects"}},[e._v("#")]),e._v(" Maven projects")]),e._v(" "),r("p",[e._v("Follow these steps if you're using Maven in your project:")]),e._v(" "),r("ol",[r("li",[r("p",[e._v("In your "),r("strong",[e._v("pom.xml")]),e._v(", add the following dependencies (make sure to specify the latest version of Cucumber):")]),e._v(" "),r("div",{staticClass:"language-xml line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-xml"}},[r("code",[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("dependency")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("\n "),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("groupId")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("io.cucumber"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")])]),e._v("\n "),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("artifactId")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("cucumber-java"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")])]),e._v("\n "),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("version")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("6.1.1"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")])]),e._v("\n "),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("scope")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("test"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")])]),e._v("\n"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")])]),e._v("\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br"),r("span",{staticClass:"line-number"},[e._v("2")]),r("br"),r("span",{staticClass:"line-number"},[e._v("3")]),r("br"),r("span",{staticClass:"line-number"},[e._v("4")]),r("br"),r("span",{staticClass:"line-number"},[e._v("5")]),r("br"),r("span",{staticClass:"line-number"},[e._v("6")]),r("br")])]),r("p",[e._v("Alternatively, if you want to use lambda expressions in step definitions, add:")]),e._v(" "),r("div",{staticClass:"language-xml line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-xml"}},[r("code",[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("dependency")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("\n "),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("groupId")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("io.cucumber"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")])]),e._v("\n "),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("artifactId")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("cucumber-java8"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")])]),e._v("\n "),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("version")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("6.1.1"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")])]),e._v("\n "),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("scope")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("test"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")])]),e._v("\n"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")])]),e._v("\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br"),r("span",{staticClass:"line-number"},[e._v("2")]),r("br"),r("span",{staticClass:"line-number"},[e._v("3")]),r("br"),r("span",{staticClass:"line-number"},[e._v("4")]),r("br"),r("span",{staticClass:"line-number"},[e._v("5")]),r("br"),r("span",{staticClass:"line-number"},[e._v("6")]),r("br")])])]),e._v(" "),r("li",[r("p",[e._v("Press CtrlShift0O or click "),r("img",{attrs:{src:"https://resources.jetbrains.com/help/img/idea/2023.3/app.actions.refresh.svg",alt:"Reimport All Maven Projects"}}),e._v(" in the Maven tool window to import the changes.")])])]),e._v(" "),r("p",[e._v("For more information about working with Maven, refer to "),r("a",{attrs:{href:"https://www.jetbrains.com/help/idea/2023.3/work-with-maven-dependencies.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Maven dependencies"),r("OutboundLink")],1),e._v(".")]),e._v(" "),r("h4",{attrs:{id:"gradle-projects"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#gradle-projects"}},[e._v("#")]),e._v(" Gradle projects")]),e._v(" "),r("p",[e._v("Use these steps if you're building your project with Gradle.")]),e._v(" "),r("ol",[r("li",[r("p",[e._v("Open your "),r("strong",[e._v("build.gradle")]),e._v(" and add the following dependencies (make sure to specify the latest version of Cucumber):")]),e._v(" "),r("p",[e._v("For Gradle 5 and later, add:")]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[e._v("dependencies "),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n testImplementation "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v("'io.cucumber:cucumber-java:6.1.1'")]),e._v("\n"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br"),r("span",{staticClass:"line-number"},[e._v("2")]),r("br"),r("span",{staticClass:"line-number"},[e._v("3")]),r("br")])]),r("p",[e._v("Alternatively, if you want to use lambda expressions in step definitions, add:")]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[e._v("dependencies "),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n testImplementation "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v("'io.cucumber:cucumber-java8:6.1.1'")]),e._v("\n"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br"),r("span",{staticClass:"line-number"},[e._v("2")]),r("br"),r("span",{staticClass:"line-number"},[e._v("3")]),r("br")])]),r("p",[e._v("For Gradle 4.10.3 and earlier, add:")]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[e._v("dependencies "),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n testCompile "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v("'io.cucumber:cucumber-java:6.1.1'")]),e._v("\n"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br"),r("span",{staticClass:"line-number"},[e._v("2")]),r("br"),r("span",{staticClass:"line-number"},[e._v("3")]),r("br")])]),r("p",[e._v("Alternatively, if you want to use lambda expressions in step definitions, add:")]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[e._v("dependencies "),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n testCompile "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v("'io.cucumber:cucumber-java8:6.1.1'")]),e._v("\n"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br"),r("span",{staticClass:"line-number"},[e._v("2")]),r("br"),r("span",{staticClass:"line-number"},[e._v("3")]),r("br")])]),r("p",[e._v("To find out your Gradle version, run "),r("code",[e._v("./gradlew --version")]),e._v(" in the Terminal (AltF12).")])]),e._v(" "),r("li",[r("p",[e._v("When the dependencies are added to your "),r("strong",[e._v("build.gradle")]),e._v(", press CtrlShift0O or click "),r("img",{attrs:{src:"https://resources.jetbrains.com/help/img/idea/2023.3/app.actions.refresh.svg",alt:"Reimport All Gradle Projects"}}),e._v(" in the Gradle tool window to import the changes.")])])]),e._v(" "),r("h2",{attrs:{id:"run-feature-file"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#run-feature-file"}},[e._v("#")]),e._v(" Run feature file")]),e._v(" "),r("h3",{attrs:{id:"前置条件"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#前置条件"}},[e._v("#")]),e._v(" 前置条件")]),e._v(" "),r("p",[e._v("Cucumber是一个通过RubyGems包管理器安装的Ruby gem")]),e._v(" "),r("ol",[r("li",[r("p",[e._v("安装Ruby")]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[r("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" yum "),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" ruby\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br")])])]),e._v(" "),r("li",[r("p",[e._v("使用Gems安装Cucumber和Allure")]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[r("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# 安装Cucumber。这将会从RubyGems.org下载并安装Cucumber及其所有依赖。")]),e._v("\ngem "),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" cucumber\n"),r("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# 安装特定版本的Cucumber")]),e._v("\ngem "),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" cucumber -v "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v("'x.x.x'")]),e._v("\n \n"),r("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# 安装Allure插件")]),e._v("\ngem "),r("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" allure-cucumber\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br"),r("span",{staticClass:"line-number"},[e._v("2")]),r("br"),r("span",{staticClass:"line-number"},[e._v("3")]),r("br"),r("span",{staticClass:"line-number"},[e._v("4")]),r("br"),r("span",{staticClass:"line-number"},[e._v("5")]),r("br"),r("span",{staticClass:"line-number"},[e._v("6")]),r("br"),r("span",{staticClass:"line-number"},[e._v("7")]),r("br")])])])]),e._v(" "),r("h3",{attrs:{id:"运行指定的feature文件"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#运行指定的feature文件"}},[e._v("#")]),e._v(" 运行指定的feature文件")]),e._v(" "),r("p",[e._v("在Cucumber中,如果你想运行指定的feature文件,你可以在命令行中指定文件路径。例如,如果你的feature文件名为"),r("code",[e._v("example.feature")]),e._v(",并且放置在"),r("code",[e._v("features")]),e._v("目录下,你可以使用以下命令来运行它:")]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[e._v("cucumber features/example.feature\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br")])]),r("p",[e._v("如果你想运行指定的场景或步骤,你可以使用"),r("code",[e._v("--name")]),e._v("或"),r("code",[e._v("-n")]),e._v('选项来运行匹配给定正则表达式的场景。例如,运行名称包含"login"的场景:')]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[e._v("cucumber features/example.feature --name "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v('"login"')]),e._v("\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br")])]),r("p",[e._v("或者使用简写形式:")]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[e._v("cucumber features/example.feature -n "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v('"login"')]),e._v("\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br")])]),r("p",[e._v("如果你想运行多个特定的feature文件,可以一次性列出所有文件路径,用空格分隔:")]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[e._v("cucumber features/example1.feature features/example2.feature\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br")])]),r("h3",{attrs:{id:"运行指定的feature文件并生成allure报告"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#运行指定的feature文件并生成allure报告"}},[e._v("#")]),e._v(" 运行指定的feature文件并生成Allure报告")]),e._v(" "),r("p",[e._v("使用以下命令来运行指定的feature文件并生成Allure报告:")]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[e._v("cucumber --tags @your_tag --format progress --format json:./cucumber-report.json --publish-quiet --name "),r("span",{pre:!0,attrs:{class:"token string"}},[e._v("'Your Scenario Name'")]),e._v(" ./path/to/your/feature/file.feature --plugin allure_cucumber\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br")])]),r("p",[e._v("参数说明:")]),e._v(" "),r("ul",[r("li",[r("code",[e._v("--tags @your_tag")]),e._v(": 运行带有特定标签的场景。")]),e._v(" "),r("li",[r("code",[e._v("--format progress")]),e._v(": 显示测试结果进度条。")]),e._v(" "),r("li",[r("code",[e._v("--format json:./cucumber-report.json")]),e._v(": 将测试结果输出为JSON格式,以便生成Allure报告。")]),e._v(" "),r("li",[r("code",[e._v("--publish-quiet")]),e._v(": 发布Allure报告时,不显示详细信息。")]),e._v(" "),r("li",[r("code",[e._v("--name 'Your Scenario Name'")]),e._v(": 运行名称为'Your Scenario Name'的场景。")]),e._v(" "),r("li",[r("code",[e._v("--plugin allure_cucumber")]),e._v(": 生成Allure兼容的报告。")])]),e._v(" "),r("p",[e._v("运行完成后,使用以下命令查看Allure报告:")]),e._v(" "),r("div",{staticClass:"language-shell line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-shell"}},[r("code",[e._v("allure serve ./allure-results\n")])]),e._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[e._v("1")]),r("br")])]),r("p",[e._v("这将在浏览器中打开Allure报告。请确保你的环境中已经安装了Allure命令行工具。")]),e._v(" "),r("h2",{attrs:{id:"reference"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#reference"}},[e._v("#")]),e._v(" Reference")]),e._v(" "),r("p",[r("a",{attrs:{href:"https://docs.cucumber.io/docs/guides/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://docs.cucumber.io/docs/guides/"),r("OutboundLink")],1)]),e._v(" "),r("p",[r("a",{attrs:{href:"https://docs.cucumber.io/docs/gherkin/reference/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://docs.cucumber.io/docs/gherkin/reference/"),r("OutboundLink")],1)]),e._v(" "),r("p",[r("a",{attrs:{href:"https://github.com/cucumber/cucumber-expressions#readme",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/cucumber/cucumber-expressions#readme"),r("OutboundLink")],1)]),e._v(" "),r("p",[r("a",{attrs:{href:"https://cucumber.io/docs/cucumber/configuration/?lang=java#type-registry",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cucumber.io/docs/cucumber/configuration/?lang=java#type-registry"),r("OutboundLink")],1)]),e._v(" "),r("p",[r("a",{attrs:{href:"https://github.com/cucumber",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/cucumber"),r("OutboundLink")],1)]),e._v(" "),r("p",[r("a",{attrs:{href:"https://github.com/cucumber/cucumber-jvm/tree/main/cucumber-junit-platform-engine",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://github.com/cucumber/cucumber-jvm/tree/main/cucumber-junit-platform-engine"),r("OutboundLink")],1)]),e._v(" "),r("p",[r("a",{attrs:{href:"https://chromedriver.chromium.org/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chromedriver.chromium.org/downloads"),r("OutboundLink")],1)]),e._v(" "),r("p",[r("a",{attrs:{href:"https://www.jetbrains.com/help/idea/2023.3/cucumber-support.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.jetbrains.com/help/idea/2023.3/cucumber-support.html"),r("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/22.e58a5ec7.js b/assets/js/22.e58a5ec7.js new file mode 100644 index 00000000..8496da35 --- /dev/null +++ b/assets/js/22.e58a5ec7.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{657:function(t,e,n){t.exports=n.p+"assets/img/20240511132157.d5724636.png"},658:function(t,e,n){t.exports=n.p+"assets/img/20240511104742.b81c0e3b.jpg"},659:function(t,e,n){t.exports=n.p+"assets/img/20240511105351.5f6f0ebc.jpg"},754:function(t,e,n){"use strict";n.r(e);var s=n(7),a=Object(s.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h2",{attrs:{id:"基本概念"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#基本概念"}},[t._v("#")]),t._v(" 基本概念")]),t._v(" "),s("h3",{attrs:{id:"junit"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#junit"}},[t._v("#")]),t._v(" JUnit")]),t._v(" "),s("p",[t._v("JUnit is a simple framework to write repeatable tests.")]),t._v(" "),s("p",[t._v("测试运行器:决定了用什么方式偏好去运行这些测试集/类/方法。")]),t._v(" "),s("p",[t._v("测试集:可能包含多个测试类。")]),t._v(" "),s("p",[t._v("测试类:包含一个或多个测试方法的文件。")]),t._v(" "),s("p",[t._v("测试方法/测试用例:用@Test注解标记的方法。")]),t._v(" "),s("p",[t._v("测试类及测试用例命名规范:")]),t._v(" "),s("ul",[s("li",[t._v("测试类命名规范: 被测试类+Test,例如:UserServiceTest")]),t._v(" "),s("li",[t._v("测试用例命名规范: test+被测试方法,例如:testGet")])]),t._v(" "),s("p",[t._v("常见的测试运行器:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("JUnit 4")]),t._v(" "),s("th",[t._v("JUnit 5")]),t._v(" "),s("th",[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("@RunWith(JUnit38ClassRunner.class)")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("用于兼容JUnit3.8的运行器")])]),t._v(" "),s("tr",[s("td",[t._v("@RunWith(JUnit4.class)")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("JUnit 4的默认运行器,用JUnit4测试工具来运行测试")])]),t._v(" "),s("tr",[s("td",[t._v("@RunWith(MockitoJUnitRunner.class)")]),t._v(" "),s("td",[t._v("@ExtendWith(MockitoExtension.class)")]),t._v(" "),s("td",[t._v("运行Mockito的运行环境")])]),t._v(" "),s("tr",[s("td",[t._v("@RunWith(SpringJUnit4ClassRunner.class)"),s("br"),t._v("@RunWith(SpringRunner.class)")]),t._v(" "),s("td",[t._v("@ExtendWith(SpringExtension.class)")]),t._v(" "),s("td",[t._v("让类运行在Spring的测试环境,以便测试开始时自动创建Spring应用上下文,并使用JUnit4测试工具运行测试。"),s("br"),t._v("@RunWith(SpringRunner.class)继承了 @RunWith(SpringJUnit4ClassRunner.class) ,用法相同。")])]),t._v(" "),s("tr",[s("td",[t._v("@RunWith(Parameterized.class)")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("参数化运行器,配合@Parameters使用JUnit的参数化功能")])]),t._v(" "),s("tr",[s("td",[t._v("@RunWith(Suite.class)"),s("br"),t._v("@SuiteClasses({ATest.class,BTest.class,CTest.class})")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("测试集运行器,配合@SuiteClasses使用JUnit的测试集功能")])])])]),t._v(" "),s("p",[t._v("JUnit3中测试用例需要继承TestCase类")]),t._v(" "),s("p",[t._v("JUnit4中测试用例无需继承TestCase类,只需标记@Test注解即可。")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th"),t._v(" "),s("th",[t._v("JUnit 3")]),t._v(" "),s("th",[t._v("JUnit 4")]),t._v(" "),s("th",[t._v("JUnit 5")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("所有测试用例前仅执行一次")]),t._v(" "),s("td",[t._v("N/A")]),t._v(" "),s("td",[t._v("@BeforeClass")]),t._v(" "),s("td",[t._v("@BeforeAll")])]),t._v(" "),s("tr",[s("td",[t._v("每个测试用例前执行")]),t._v(" "),s("td",[t._v("setUp()")]),t._v(" "),s("td",[t._v("@Before")]),t._v(" "),s("td",[t._v("@BeforeEach")])]),t._v(" "),s("tr",[s("td",[t._v("执行测试用例")]),t._v(" "),s("td",[t._v("N/A")]),t._v(" "),s("td",[t._v("@Test")]),t._v(" "),s("td",[t._v("@Test")])]),t._v(" "),s("tr",[s("td",[t._v("每个测试用例后执行")]),t._v(" "),s("td",[t._v("tearDown()")]),t._v(" "),s("td",[t._v("@After")]),t._v(" "),s("td",[t._v("@AfterEach")])]),t._v(" "),s("tr",[s("td",[t._v("所有测试用例后仅执行一次")]),t._v(" "),s("td",[t._v("N/A")]),t._v(" "),s("td",[t._v("@AfterClass")]),t._v(" "),s("td",[t._v("@AfterAll")])])])]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("JUnit 4 Annotation")]),t._v(" "),s("th",{staticStyle:{"text-align":"left"}},[t._v("JUnit 5 Annotation")]),t._v(" "),s("th",{staticStyle:{"text-align":"left"}},[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[s("code",[t._v("@Test")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@Test")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Denotes that a method is a test method. Unlike JUnit 4’s "),s("code",[t._v("@Test")]),t._v(" annotation, this annotation does not declare any attributes, since test extensions in JUnit Jupiter operate based on their own dedicated annotations. Such methods are "),s("em",[t._v("inherited")]),t._v(" unless they are "),s("em",[t._v("overridden")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@ParameterizedTest")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Denotes that a method is a "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests",target:"_blank",rel:"noopener noreferrer"}},[t._v("parameterized test"),s("OutboundLink")],1),t._v(". Such methods are "),s("em",[t._v("inherited")]),t._v(" unless they are "),s("em",[t._v("overridden")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@RepeatedTest")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Denotes that a method is a test template for a "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-repeated-tests",target:"_blank",rel:"noopener noreferrer"}},[t._v("repeated test"),s("OutboundLink")],1),t._v(". Such methods are "),s("em",[t._v("inherited")]),t._v(" unless they are "),s("em",[t._v("overridden")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@TestFactory")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Denotes that a method is a test factory for "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-dynamic-tests",target:"_blank",rel:"noopener noreferrer"}},[t._v("dynamic tests"),s("OutboundLink")],1),t._v(". Such methods are "),s("em",[t._v("inherited")]),t._v(" unless they are "),s("em",[t._v("overridden")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@TestTemplate")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Denotes that a method is a "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-templates",target:"_blank",rel:"noopener noreferrer"}},[t._v("template for test cases"),s("OutboundLink")],1),t._v(" designed to be invoked multiple times depending on the number of invocation contexts returned by the registered "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#extensions-test-templates",target:"_blank",rel:"noopener noreferrer"}},[t._v("providers"),s("OutboundLink")],1),t._v(". Such methods are "),s("em",[t._v("inherited")]),t._v(" unless they are "),s("em",[t._v("overridden")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@TestClassOrder")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Used to configure the "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order-classes",target:"_blank",rel:"noopener noreferrer"}},[t._v("test class execution order"),s("OutboundLink")],1),t._v(" for "),s("code",[t._v("@Nested")]),t._v(" test classes in the annotated test class. Such annotations are "),s("em",[t._v("inherited")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@TestMethodOrder")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Used to configure the "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order-methods",target:"_blank",rel:"noopener noreferrer"}},[t._v("test method execution order"),s("OutboundLink")],1),t._v(" for the annotated test class; similar to JUnit 4’s "),s("code",[t._v("@FixMethodOrder")]),t._v(". Such annotations are "),s("em",[t._v("inherited")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@TestInstance")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Used to configure the "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle",target:"_blank",rel:"noopener noreferrer"}},[t._v("test instance lifecycle"),s("OutboundLink")],1),t._v(" for the annotated test class. Such annotations are "),s("em",[t._v("inherited")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@DisplayName")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Declares a custom "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-display-names",target:"_blank",rel:"noopener noreferrer"}},[t._v("display name"),s("OutboundLink")],1),t._v(" for the test class or test method. Such annotations are not "),s("em",[t._v("inherited")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@DisplayNameGeneration")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Declares a custom "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-display-name-generator",target:"_blank",rel:"noopener noreferrer"}},[t._v("display name generator"),s("OutboundLink")],1),t._v(" for the test class. Such annotations are "),s("em",[t._v("inherited")]),t._v(".")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("@Before")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@BeforeEach")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Denotes that the annotated method should be executed "),s("em",[t._v("before")]),t._v(" "),s("strong",[t._v("each")]),t._v(" "),s("code",[t._v("@Test")]),t._v(", "),s("code",[t._v("@RepeatedTest")]),t._v(", "),s("code",[t._v("@ParameterizedTest")]),t._v(", or "),s("code",[t._v("@TestFactory")]),t._v(" method in the current class; analogous to JUnit 4’s "),s("code",[t._v("@Before")]),t._v(". Such methods are "),s("em",[t._v("inherited")]),t._v(" – unless they are "),s("em",[t._v("overridden")]),t._v(" or "),s("em",[t._v("superseded")]),t._v(" (i.e., replaced based on signature only, irrespective of Java’s visibility rules).")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("@After")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@AfterEach")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Denotes that the annotated method should be executed "),s("em",[t._v("after")]),t._v(" "),s("strong",[t._v("each")]),t._v(" "),s("code",[t._v("@Test")]),t._v(", "),s("code",[t._v("@RepeatedTest")]),t._v(", "),s("code",[t._v("@ParameterizedTest")]),t._v(", or "),s("code",[t._v("@TestFactory")]),t._v(" method in the current class; analogous to JUnit 4’s "),s("code",[t._v("@After")]),t._v(". Such methods are "),s("em",[t._v("inherited")]),t._v(" – unless they are "),s("em",[t._v("overridden")]),t._v(" or "),s("em",[t._v("superseded")]),t._v(" (i.e., replaced based on signature only, irrespective of Java’s visibility rules).")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("@BeforeClass")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@BeforeAll")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Denotes that the annotated method should be executed "),s("em",[t._v("before")]),t._v(" "),s("strong",[t._v("all")]),t._v(" "),s("code",[t._v("@Test")]),t._v(", "),s("code",[t._v("@RepeatedTest")]),t._v(", "),s("code",[t._v("@ParameterizedTest")]),t._v(", and "),s("code",[t._v("@TestFactory")]),t._v(" methods in the current class; analogous to JUnit 4’s "),s("code",[t._v("@BeforeClass")]),t._v(". Such methods are "),s("em",[t._v("inherited")]),t._v(" – unless they are "),s("em",[t._v("hidden")]),t._v(", "),s("em",[t._v("overridden")]),t._v(", or "),s("em",[t._v("superseded")]),t._v(", (i.e., replaced based on signature only, irrespective of Java’s visibility rules) – and must be "),s("code",[t._v("static")]),t._v(' unless the "per-class" '),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle",target:"_blank",rel:"noopener noreferrer"}},[t._v("test instance lifecycle"),s("OutboundLink")],1),t._v(" is used.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("@AfterClass")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@AfterAll")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Denotes that the annotated method should be executed "),s("em",[t._v("after")]),t._v(" "),s("strong",[t._v("all")]),t._v(" "),s("code",[t._v("@Test")]),t._v(", "),s("code",[t._v("@RepeatedTest")]),t._v(", "),s("code",[t._v("@ParameterizedTest")]),t._v(", and "),s("code",[t._v("@TestFactory")]),t._v(" methods in the current class; analogous to JUnit 4’s "),s("code",[t._v("@AfterClass")]),t._v(". Such methods are "),s("em",[t._v("inherited")]),t._v(" – unless they are "),s("em",[t._v("hidden")]),t._v(", "),s("em",[t._v("overridden")]),t._v(", or "),s("em",[t._v("superseded")]),t._v(", (i.e., replaced based on signature only, irrespective of Java’s visibility rules) – and must be "),s("code",[t._v("static")]),t._v(' unless the "per-class" '),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle",target:"_blank",rel:"noopener noreferrer"}},[t._v("test instance lifecycle"),s("OutboundLink")],1),t._v(" is used.")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@Nested")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Denotes that the annotated class is a non-static "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-nested",target:"_blank",rel:"noopener noreferrer"}},[t._v("nested test class"),s("OutboundLink")],1),t._v(". On Java 8 through Java 15, "),s("code",[t._v("@BeforeAll")]),t._v(" and "),s("code",[t._v("@AfterAll")]),t._v(" methods cannot be used directly in a "),s("code",[t._v("@Nested")]),t._v(' test class unless the "per-class" '),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle",target:"_blank",rel:"noopener noreferrer"}},[t._v("test instance lifecycle"),s("OutboundLink")],1),t._v(" is used. Beginning with Java 16, "),s("code",[t._v("@BeforeAll")]),t._v(" and "),s("code",[t._v("@AfterAll")]),t._v(" methods can be declared as "),s("code",[t._v("static")]),t._v(" in a "),s("code",[t._v("@Nested")]),t._v(" test class with either test instance lifecycle mode. Such annotations are not "),s("em",[t._v("inherited")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@Tag")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Used to declare "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-tagging-and-filtering",target:"_blank",rel:"noopener noreferrer"}},[t._v("tags for filtering tests"),s("OutboundLink")],1),t._v(", either at the class or method level; analogous to test groups in TestNG or Categories in JUnit 4. Such annotations are "),s("em",[t._v("inherited")]),t._v(" at the class level but not at the method level.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("@Ignore")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@Disabled")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Used to "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-disabling",target:"_blank",rel:"noopener noreferrer"}},[t._v("disable"),s("OutboundLink")],1),t._v(" a test class or test method; analogous to JUnit 4’s "),s("code",[t._v("@Ignore")]),t._v(". Such annotations are not "),s("em",[t._v("inherited")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@Timeout")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Used to fail a test, test factory, test template, or lifecycle method if its execution exceeds a given duration. Such annotations are "),s("em",[t._v("inherited")]),t._v(".")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("@RunWith")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@ExtendWith")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Used to "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#extensions-registration-declarative",target:"_blank",rel:"noopener noreferrer"}},[t._v("register extensions declaratively"),s("OutboundLink")],1),t._v(". Such annotations are "),s("em",[t._v("inherited")]),t._v("."),s("br"),t._v("指定测试用例运行环境")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@RegisterExtension")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Used to "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#extensions-registration-programmatic",target:"_blank",rel:"noopener noreferrer"}},[t._v("register extensions programmatically"),s("OutboundLink")],1),t._v(" via fields. Such fields are "),s("em",[t._v("inherited")]),t._v(" unless they are "),s("em",[t._v("shadowed")]),t._v(".")])]),t._v(" "),s("tr",[s("td"),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[s("code",[t._v("@TempDir")])]),t._v(" "),s("td",{staticStyle:{"text-align":"left"}},[t._v("Used to supply a "),s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/#writing-tests-built-in-extensions-TempDirectory",target:"_blank",rel:"noopener noreferrer"}},[t._v("temporary directory"),s("OutboundLink")],1),t._v(" via field injection or parameter injection in a lifecycle method or test method; located in the "),s("code",[t._v("org.junit.jupiter.api.io")]),t._v(" package.")])])])]),t._v(" "),s("h4",{attrs:{id:"junit-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#junit-4"}},[t._v("#")]),t._v(" JUnit 4")]),t._v(" "),s("p",[t._v("https://junit.org/junit4/")]),t._v(" "),s("h4",{attrs:{id:"junit-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#junit-5"}},[t._v("#")]),t._v(" JUnit 5")]),t._v(" "),s("p",[t._v("Unlike previous versions of JUnit, JUnit 5 is composed of several different modules from three different sub-projects.")]),t._v(" "),s("p",[t._v("JUnit 5 = JUnit Platform + JUnit Jupiter+ JUnit Vintage")]),t._v(" "),s("p",[t._v("JUnit Platform:用于在 JVM 上运行测试的基础设施,无论是编程模型还是命令行工具。")]),t._v(" "),s("p",[t._v("JUnit Jupiter:JUnit 5 的新模块,它提供了编写测试的新的程序化模型。")]),t._v(" "),s("p",[t._v("JUnit Vintage:用于在 JUnit 平台上运行旧的 JUnit 3 和 JUnit 4 测试的引擎。")]),t._v(" "),s("p",[t._v("JUnit Platform是JUnit5的核心组成部分,它定义了一个抽象的TestEngine API,用于在平台上运行测试框架。这意味着其他自动化测试引擎或开发人员自己定制的引擎都可以接入JUnit5实现对接和执行。JUnit Platform还支持通过命令行、Gradle和Maven来运行测试。")]),t._v(" "),s("p",[t._v("JUnit Jupiter是JUnit5的扩展部分,它提供了新的编程模型和扩展模型,使编写测试用例更加方便。这个部分可以看作是承载JUnit4原有功能的演进,包含了JUnit5最新的编程模型和扩展机制。通过这些新特性,JUnit Jupiter使自动化测试更加方便、功能更加强大。")]),t._v(" "),s("p",[t._v("JUnit Vintage提供了一个在平台上运行JUnit3和JUnit4的TestEngine。这意味着,如果你在使用JUnit3或JUnit4编写的旧测试用例,你可以将这些用例迁移到JUnit5上,并从中受益。")]),t._v(" "),s("p",[t._v("IntelliJ IDEA supports running tests on the JUnit Platform since version 2016.2. For details please see the "),s("a",{attrs:{href:"https://blog.jetbrains.com/idea/2016/08/using-junit-5-in-intellij-idea/",target:"_blank",rel:"noopener noreferrer"}},[t._v("post on the IntelliJ IDEA blog"),s("OutboundLink")],1),t._v(". Note, however, that it is recommended to use IDEA 2017.3 or newer since these newer versions of IDEA will download the following JARs automatically based on the API version used in the project: "),s("code",[t._v("junit-platform-launcher")]),t._v(", "),s("code",[t._v("junit-jupiter-engine")]),t._v(", and "),s("code",[t._v("junit-vintage-engine")]),t._v(".")]),t._v(" "),s("p",[t._v("https://junit.org/junit5/")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://junit.org/junit5/docs/current/user-guide/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://junit.org/junit5/docs/current/user-guide/"),s("OutboundLink")],1)]),t._v(" "),s("p",[s("a",{attrs:{href:"https://github.com/junit-team/junit5-samples",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/junit-team/junit5-samples"),s("OutboundLink")],1)]),t._v(" "),s("h5",{attrs:{id:"参数化测试-数据驱动测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#参数化测试-数据驱动测试"}},[t._v("#")]),t._v(" 参数化测试/数据驱动测试")]),t._v(" "),s("p",[t._v("参数化测试必须将 @Test 注解替换为 @ParameterizedTest 注解。")]),t._v(" "),s("ul",[s("li",[t._v("@ValueSource 注解可提供单个数组作为测试数据。")]),t._v(" "),s("li",[t._v("@NullSource 注解用于传递null值。")]),t._v(" "),s("li",[t._v("@EmptySource 注解用于传递空值。")]),t._v(" "),s("li",[t._v("@NullAndEmptySource 注解是 @NullSource 和 @EmptySource 的组合注解,可同时提供null值和空值。")]),t._v(" "),s("li",[t._v("@EnumSource 注解可提供单个枚举作为测试数据。")]),t._v(" "),s("li",[t._v("@MethodSource 注解读取指定方法的返回值作为参数化测试的入参(注意方法返回类型必须是一个流)。")]),t._v(" "),s("li",[t._v("@CsvSource 注解可提供单组或多组参数。")]),t._v(" "),s("li",[t._v("@CsvFileSource 注解通过读取CSV文件作为参数化测试的入参。")]),t._v(" "),s("li",[t._v("实现 ArgumentsProvider 接口,并配合 @ArgumentsSource 注解来给测试方法提供测试数据。")])]),t._v(" "),s("h3",{attrs:{id:"spring常用注解"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#spring常用注解"}},[t._v("#")]),t._v(" Spring常用注解")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("注解")]),t._v(" "),s("th",[t._v("作用")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("@WebMvcTest")]),t._v(" "),s("td",[t._v("启动一个应用程序上下文,该上下文只包含测试 Web 控制器所需的 bean")])]),t._v(" "),s("tr",[s("td",[t._v("@AutoConfigureMockMvc")]),t._v(" "),s("td",[t._v("可以应用于测试类以启用和配置MockMvc的自动配置的注释。")])]),t._v(" "),s("tr",[s("td",[t._v("@PropertySource")]),t._v(" "),s("td",[t._v("加载配置文件")])]),t._v(" "),s("tr",[s("td",[t._v("@TestPropertySource")]),t._v(" "),s("td",[t._v("加载配置文件。@TestPropertySource可以用来覆盖掉来自于系统环境变量,Java的系统属性,@PropertySource的属性。")])]),t._v(" "),s("tr",[s("td",[t._v("@ActiveProfiles")]),t._v(" "),s("td",[t._v("激活指定环境"),s("br"),t._v('@ActiveProfiles(profiles = {"default", "local", "test"})'),s("br"),t._v("如果有相同配置,后面同名配置会覆盖前面的。")])]),t._v(" "),s("tr",[s("td",[t._v("@ContextConfiguration")]),t._v(" "),s("td",[t._v("用来加载ApplicationContext")])])])]),t._v(" "),s("p",[t._v("@WebMvcTest 示例:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@WebMvcTest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("controllers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UserController")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@ExtendWith")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SpringExtension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("@AutoConfigureMockMvc 示例:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@AutoConfigureMockMvc")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@SpringBootTest")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br")])]),s("p",[t._v("@ContextConfiguration 示例:")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@ActiveProfiles")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"local"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@PropertySource")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/application-local.yml"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@ContextConfiguration")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n classes "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SftpOutboundFactoryTest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ContextConfig")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 用来加载配置类")]),t._v("\n initializers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConfigDataApplicationContextInitializer")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 用来加载配置文件")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token annotation punctuation"}},[t._v("@ExtendWith")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SpringExtension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br")])]),s("h2",{attrs:{id:"常见的mock框架"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#常见的mock框架"}},[t._v("#")]),t._v(" 常见的Mock框架")]),t._v(" "),s("p",[s("img",{attrs:{src:n(657),alt:""}})]),t._v(" "),s("h3",{attrs:{id:"mockito"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#mockito"}},[t._v("#")]),t._v(" Mockito")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://site.mockito.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://site.mockito.org/"),s("OutboundLink")],1)]),t._v(" "),s("p",[s("strong",[t._v("mockito-core")]),t._v(":Mockito 核心依赖,提供了 Mockito 框架的核心功能和 API。")]),t._v(" "),s("p",[s("strong",[t._v("mockito-junit-jupiter")]),t._v(":Mockito 与 JUnit Jupiter 的集成依赖,用于在 JUnit 5 环境下使用 Mockito 进行单元测试。")]),t._v(" "),s("p",[s("strong",[t._v("mockito-inline")]),t._v(":Mockito 的内联依赖,用于支持内联(inline)Mocks 的创建和使用。")]),t._v(" "),s("p",[s("strong",[t._v("Note that you must use @RunWith(MockitoJUnitRunner.class) or MockitoAnnotations.initMocks(this) to initialize these mocks and inject them.")])]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#mock-java.lang.Class-",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("mock()")]),s("OutboundLink")],1),t._v("/"),s("a",{attrs:{href:"https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mock.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("@Mock")]),s("OutboundLink")],1),t._v(": create mock\n"),s("ul",[s("li",[t._v("optionally specify how it should behave via "),s("a",{attrs:{href:"http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/stubbing/Answer.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("Answer")]),s("OutboundLink")],1),t._v("/"),s("a",{attrs:{href:"http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/MockSettings.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("MockSettings")]),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#when-T-",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("when()")]),s("OutboundLink")],1),t._v("/"),s("a",{attrs:{href:"http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/BDDMockito.html#given-T-",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("given()")]),s("OutboundLink")],1),t._v(" to specify how a mock should behave")]),t._v(" "),s("li",[t._v("If the provided answers don’t fit your needs, write one yourself extending the "),s("a",{attrs:{href:"http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/stubbing/Answer.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("Answer")]),s("OutboundLink")],1),t._v(" interface")])])]),t._v(" "),s("li",[s("a",{attrs:{href:"http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#spy-T-",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("spy()")]),s("OutboundLink")],1),t._v("/"),s("a",{attrs:{href:"http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Spy.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("@Spy")]),s("OutboundLink")],1),t._v(": partial mocking, real methods are invoked but still can be verified and stubbed")]),t._v(" "),s("li",[s("a",{attrs:{href:"http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/InjectMocks.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("@InjectMocks")]),s("OutboundLink")],1),t._v(": automatically inject mocks/spies fields annotated with "),s("code",[t._v("@Spy")]),t._v(" or "),s("code",[t._v("@Mock")])]),t._v(" "),s("li",[s("a",{attrs:{href:"https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#verify-T-",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("verify()")]),s("OutboundLink")],1),t._v(": to check methods were called with given arguments\n"),s("ul",[s("li",[t._v("can use flexible argument matching, for example any expression via the "),s("a",{attrs:{href:"http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/ArgumentMatchers.html#any--",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("any()")]),s("OutboundLink")],1)]),t._v(" "),s("li",[t._v("or capture what arguments were called using "),s("a",{attrs:{href:"http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Captor.html",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("@Captor")]),s("OutboundLink")],1),t._v(" instead")])])])]),t._v(" "),s("p",[t._v("What are the limitations of Mockito: "),s("a",{attrs:{href:"https://github.com/mockito/mockito/wiki/FAQ",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/mockito/mockito/wiki/FAQ"),s("OutboundLink")],1)]),t._v(" "),s("p",[t._v("常见注解使用:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Non-Spring Env")]),t._v(" "),s("th",[t._v("Spring Env")]),t._v(" "),s("th",[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("@InjectMocks")]),t._v(" "),s("td",[t._v("@Autowired")]),t._v(" "),s("td",[t._v("创建类实例并注入依赖的模拟,以便在单元测试中更好地控制测试环境,提高测试的准确性。"),s("br"),t._v("@InjectMocks creates an instance of the class and injects the mocks that are created with the @Mock (or @Spy ) annotations into this instance."),s("br"),t._v("@InjectMocks will only inject mocks/spies created using the @Spy or @Mock annotation."),s("br"),t._v("@Autowired will only inject mocks/spies created using the @SpyBean or @MockBean annotation.")])]),t._v(" "),s("tr",[s("td",[t._v("@Mock")]),t._v(" "),s("td",[t._v("@MockBean")]),t._v(" "),s("td",[t._v("创建模拟"),s("br"),t._v("@Mock 相当于 Mockito.mock(Class"),s("T",[t._v(" classToMock)"),s("br"),t._v("打桩的方法均使用模拟,不会真实调用")])],1)]),t._v(" "),s("tr",[s("td",[t._v("@Spy")]),t._v(" "),s("td",[t._v("@SpyBean")]),t._v(" "),s("td",[t._v("创建模拟"),s("br"),t._v("@Spy 相当于 Mockito.spy(Class"),s("T",[t._v(" classToSpy)"),s("br"),t._v("如果某方法没有打桩,则真实调用,否则使用模拟。")])],1)])])]),t._v(" "),s("h4",{attrs:{id:"打桩-stubbing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#打桩-stubbing"}},[t._v("#")]),t._v(" 打桩(stubbing)")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 有返回值")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("when")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mockObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("someMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("thenReturn")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("someReturnValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("doReturn")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("someReturnValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("when")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mockObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("someMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 无返回值")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("doNothing")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("when")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mockObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("someMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 抛出异常")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("when")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mockObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("someMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("thenThrow")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("someException"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("doThrow")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("someException"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("when")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mockObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("someMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br"),s("span",{staticClass:"line-number"},[t._v("8")]),s("br"),s("span",{staticClass:"line-number"},[t._v("9")]),s("br"),s("span",{staticClass:"line-number"},[t._v("10")]),s("br")])]),s("h4",{attrs:{id:"断言-assertion"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#断言-assertion"}},[t._v("#")]),t._v(" 断言(assertion)")]),t._v(" "),s("div",{staticClass:"language-java line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-java"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// org.junit.jupiter.api.Assertions")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 方法是否被调用")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("verify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mockObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("never")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("someMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"never called"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("verify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mockObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("atLeastOnce")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("someMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"called at least once"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("verify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mockObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("atLeast")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("someMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"called at least twice"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("verify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mockObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("atMost")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("someMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"called at most three times"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("verify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("mockObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("times")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("someMethod")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"called four times"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br"),s("span",{staticClass:"line-number"},[t._v("7")]),s("br")])]),s("h3",{attrs:{id:"powermock"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#powermock"}},[t._v("#")]),t._v(" PowerMock")]),t._v(" "),s("p",[t._v("当所测逻辑里有静态工具类方法或私有方法时,我们希望它返回特定值时(极值边界、异常测试场景),我们可以用PowerMock弥补Mockito的不足。")]),t._v(" "),s("p",[s("a",{attrs:{href:"http://powermock.github.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://powermock.github.io/"),s("OutboundLink")],1)]),t._v(" "),s("p",[s("a",{attrs:{href:"https://github.com/powermock/powermock/wiki/Mockito-Maven",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://github.com/powermock/powermock/wiki/Mockito-Maven"),s("OutboundLink")],1)]),t._v(" "),s("h2",{attrs:{id:"常用插件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#常用插件"}},[t._v("#")]),t._v(" 常用插件")]),t._v(" "),s("h3",{attrs:{id:"maven-surefire-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#maven-surefire-plugin"}},[t._v("#")]),t._v(" Maven Surefire Plugin")]),t._v(" "),s("p",[t._v("Maven Surefire Plugin的作用是用于执行单元测试。")]),t._v(" "),s("p",[t._v("这个插件可以自动识别和运行src/test目录下利用特定测试框架(如JUnit、TestNG等)编写的测试用例。Surefire Plugin也能识别和执行符合一定命名约定的普通类中的测试方法,例如,以Test结尾的测试类(如helloTest.java)。在Maven的生命周期中,test阶段默认绑定了Surefire Plugin的test目标,无需额外配置,直接运行run test即可。此外,Surefire Plugin还具有高度的可配置性和灵活性,支持多种单元测试框架,并且可以自定义测试用例的命名模式,通过合理配置和使用该插件,可以帮助开发者提高代码质量和项目稳定性。")]),t._v(" "),s("h3",{attrs:{id:"jacoco-java-code-coverage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#jacoco-java-code-coverage"}},[t._v("#")]),t._v(" JaCoCo(Java Code Coverage)")]),t._v(" "),s("p",[t._v("JaCoCo(Java Code Coverage)是一种分析单元测试覆盖率的工具。")]),t._v(" "),s("p",[t._v("The JaCoCo Maven Plugin provides the JaCoCo runtime agent to your tests and allows basic report creation.")]),t._v(" "),s("p",[t._v("IDEA配置JaCoCo")]),t._v(" "),s("p",[s("img",{attrs:{src:n(658),alt:""}})]),t._v(" "),s("p",[t._v("正常情况下,测试类所在包结构与被测试的类所在包结构相同,直接点击run tests with coverage就可以运行测试查看覆盖率。若包结构不同,但是你又没有权限修改该项目的包结构,那么可以通过配置来查看单测覆盖率。")]),t._v(" "),s("p",[s("img",{attrs:{src:n(659),alt:""}})]),t._v(" "),s("h2",{attrs:{id:"常见问题"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#常见问题"}},[t._v("#")]),t._v(" 常见问题")]),t._v(" "),s("h3",{attrs:{id:"springextension-mockitoextension"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#springextension-mockitoextension"}},[t._v("#")]),t._v(" SpringExtension & MockitoExtension")]),t._v(" "),s("p",[s("code",[t._v("SpringExtension")]),t._v(" integrates the Spring TestContext Framework into JUnit 5's Jupiter.")]),t._v(" "),s("p",[s("code",[t._v("MockitoExtension")]),t._v(" is the JUnit Jupiter equivalent of our JUnit4 "),s("code",[t._v("MockitoJUnitRunner")]),t._v(".")]),t._v(" "),s("p",[s("strong",[t._v("When to use @Extendwith(SpringExtension.class) or @Extendwith(MockitoExtension.class) in JUnit 5?")])]),t._v(" "),s("p",[s("strong",[t._v("When involving Spring")]),t._v(":")]),t._v(" "),s("p",[t._v("If you want to use Spring test framework features in your tests like for example "),s("code",[t._v("@MockBean")]),t._v(" , then you have to use "),s("code",[t._v("@Extendwith(SpringExtension.class)")]),t._v(". It replaces the deprecated JUnit 4 "),s("code",[t._v("@Runwith(SpringJUnit4classRunner.class)")])]),t._v(" "),s("p",[s("strong",[t._v("When NOT involving Spring")]),t._v(":")]),t._v(" "),s("p",[t._v("If you just want to involve Mockito and don't have to involve Spring, for example,when you just want to use the "),s("code",[t._v("@Mock")]),t._v(" / "),s("code",[t._v("@InjectMocks")]),t._v(" annotations, then you want to use "),s("code",[t._v("@Extendwith(MockitoExtension.class)")]),t._v(" as it doesn't load in a bunch of unneeded Spring stuff. It replaces the deprecated JUnit 4 "),s("code",[t._v("@Runwith(MockitooUnitRunner.class)")]),t._v(".")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/23.6cdc4e7f.js b/assets/js/23.6cdc4e7f.js new file mode 100644 index 00000000..527e82ea --- /dev/null +++ b/assets/js/23.6cdc4e7f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{663:function(a,t,v){a.exports=v.p+"assets/img/20240807225526.24414201.jpg"},664:function(a,t,v){a.exports=v.p+"assets/img/20240807225726.1b146567.jpg"},665:function(a,t,v){a.exports=v.p+"assets/img/20240807225914.bcd1d9b9.jpg"},757:function(a,t,v){"use strict";v.r(t);var e=v(7),_=Object(e.a)({},(function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("p",[a._v("FQDN,全称为“Fully Qualified Domain Name”,即完全限定域名。它是指一个域名系统中的完全限定名称,包括主机名和域名。在FQDN中,主机名和域名之间使用“.”(点)分隔。例如,www.example.com就是一个FQDN,其中www是主机名,example.com是域名,example是次级域名(SLD),com是顶级域名(TLD)。")]),a._v(" "),e("p",[a._v("FQDN在网络中用于唯一标识和寻址主机或服务。它在许多网络协议中使用,例如DNS(域名系统),HTTP(超文本传输协议)等。通过使用FQDN,可以确保在全球范围内唯一地标识和访问网络上的资源。")]),a._v(" "),e("p",[e("img",{attrs:{src:v(663),alt:""}})]),a._v(" "),e("p",[e("img",{attrs:{src:v(664),alt:""}})]),a._v(" "),e("p",[e("img",{attrs:{src:v(665),alt:""}})]),a._v(" "),e("h2",{attrs:{id:"dns记录类型"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dns记录类型"}},[a._v("#")]),a._v(" DNS记录类型")]),a._v(" "),e("p",[e("a",{attrs:{href:"https://www.cnblogs.com/eagle6688/p/17100030.html",target:"_blank",rel:"noopener noreferrer"}},[a._v("https://www.cnblogs.com/eagle6688/p/17100030.html"),e("OutboundLink")],1)]),a._v(" "),e("p",[a._v("DNS解析将域名指向IP地址,是互联网中的一项重要服务。由于业务场景不同,在设置DNS解析时,需要选择不同的记录类型。网站管理人员需要准确了解每一种DNS记录类型所代表的含义和用途,才能满足不同场景的解析需求。")]),a._v(" "),e("h3",{attrs:{id:"a记录"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#a记录"}},[a._v("#")]),a._v(" A记录")]),a._v(" "),e("p",[a._v("A记录,Address record(IPv4),是最常见和最常用的一种记录类型,用于指定主机名和IP(IPv4)地址之间的关系。通过添加A记录,网站管理者可以将域名与网站服务器地址进行绑定。")]),a._v(" "),e("p",[a._v("格式:[FQDN] IN A [IP地址]")]),a._v(" "),e("p",[a._v("例子:ns1.exmaple.com. IN A 192.168.0.1")]),a._v(" "),e("p",[a._v("查询:")]),a._v(" "),e("p",[a._v("nslookup -qt=A example.com (Windows)")]),a._v(" "),e("p",[a._v("nslookup -q=A example.com ("),e("strong",[a._v("Linux,务必注意Linux下类型参数为-q而不是-qt,下同")]),a._v(")")]),a._v(" "),e("p",[a._v("A就是Address的首字母,这种记录就是将域名映射到一个IPv4地址上,这也是最常用的DNS记录类型。")]),a._v(" "),e("p",[a._v("A记录必须指向一个IP地址,不能指向另一个DNS记录。")]),a._v(" "),e("p",[a._v("此外,A记录还可用于email路由,比如一个域名的MX记录可以指向一个A记录,这个A记录指向该域名邮件服务器的IP地址。")]),a._v(" "),e("h3",{attrs:{id:"aaaa记录"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#aaaa记录"}},[a._v("#")]),a._v(" AAAA记录")]),a._v(" "),e("p",[a._v("AAAA记录,Address record(IPv6),是用于将域名解析到IPv6地址的一种DNS记录类型。国内很多解析服务器不支持AAAA记录的设置,如果想进行AAAA记录解析,就需要将域名的NS记录指向一些专业的域名解析厂商。")]),a._v(" "),e("p",[a._v("格式:[FQDN] IN AAAA [IP地址]")]),a._v(" "),e("p",[a._v("例子:ns1.exmaple.com. IN AAAA 8fe0::8f61:ac8:30cd:a16e")]),a._v(" "),e("p",[a._v("查询:nslookup -qt=AAAA example.com")]),a._v(" "),e("p",[a._v("与A记录类似,AAAA记录是将域名映射到IPv6地址上。")]),a._v(" "),e("h3",{attrs:{id:"cname记录"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cname记录"}},[a._v("#")]),a._v(" CNAME记录")]),a._v(" "),e("p",[a._v("CNAME记录,Canonical name record,也是比较常用的一种记录类型,它是主机名到主机名的映射。如果需要将域名指向另一个域名,而不是一个IP地址,那么就需要添加一条CNAME记录。在CDN、企业邮箱、全局流量管理等业务场景下,经常会使用到CNAME记录。")]),a._v(" "),e("p",[a._v("格式:[域名1別名] IN CNAME [域名1]")]),a._v(" "),e("p",[a._v("例子:sub.example.com. IN CNAME my.example.com.")]),a._v(" "),e("p",[a._v("查询:nslookup -qt=CNAME sub.example.com")]),a._v(" "),e("p",[a._v("CNAME记录就是别名记录,一个常用的例子是将短域名指向www域名,比如: example.com IN CNAME www.example.com")]),a._v(" "),e("h3",{attrs:{id:"ns记录"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ns记录"}},[a._v("#")]),a._v(" NS记录")]),a._v(" "),e("p",[a._v("NS记录用于将子域名交给其他DNS服务商解析时使用,从某种意义上来讲NS记录相当于设置子域名解析服务器的A记录,用于在解析请求时确定该服务器的IP地址。大多数域名注册商默认使用自己的NS记录来解析用户的域名,但用户也可以设置NS记录指向更专业安全的域名解析厂商。")]),a._v(" "),e("h3",{attrs:{id:"mx记录"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mx记录"}},[a._v("#")]),a._v(" MX记录")]),a._v(" "),e("p",[a._v("MX记录,Mail exchange record,是邮件交换记录,主要用于邮箱解析,在发送邮件时根据收件人的地址后缀进行邮件服务器的定位。MX记录的权重对邮件服务非常重要,发送邮件时,会先对域名进行解析,查找MX记录,按照权重从小到大的顺序联通服务器进行邮件发送。")]),a._v(" "),e("p",[a._v("格式:[FQDN] IN MX [优先级] [邮件服务器]")]),a._v(" "),e("p",[a._v("例子:")]),a._v(" "),e("p",[a._v("example.com. IN MX 10 mail.example.com")]),a._v(" "),e("p",[a._v("mail.example.com. IN A 10.8.0.1")]),a._v(" "),e("p",[a._v("查询:nslookup -qt=MX sub.example.com")]),a._v(" "),e("p",[a._v("MX记录是DNS中非常重要的一类记录,它用于email邮箱地址解析。如果没有配置example.com的MX记录,那么发往example.com域名的所有邮件均无法送达。")]),a._v(" "),e("p",[a._v("注意:")]),a._v(" "),e("p",[a._v("(1) MX记录中的优先级数值越低,它的优先级越高;")]),a._v(" "),e("p",[a._v("(2) 可以配置多个MX记录,邮件送达时首选优先级最高的邮件服务器,如果该邮件服务器不可用,则选择次高优先级的服务器。")]),a._v(" "),e("h3",{attrs:{id:"txt记录"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#txt记录"}},[a._v("#")]),a._v(" TXT记录")]),a._v(" "),e("p",[a._v("TXT记录,一般用于某个主机名的标识和说明,通过设置TXT记录可以使别人更方便地联系到你。此外TXT记录还常用于做SPF反垃圾邮件和SSL证书的DNS验证等。")]),a._v(" "),e("h3",{attrs:{id:"ptr记录"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ptr记录"}},[a._v("#")]),a._v(" PTR记录")]),a._v(" "),e("p",[a._v("PTR记录可以简单理解为A记录的反向记录,用于将一个IP地址指向对应的主机名,实现通过IP地址访问域名。")]),a._v(" "),e("h3",{attrs:{id:"soa记录"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#soa记录"}},[a._v("#")]),a._v(" SOA记录")]),a._v(" "),e("p",[a._v("SOA记录又叫起始授权机构记录,NS标记多台解析服务器,SOA记录用于表明在众多NS记录中哪一台才是主服务器。当要查询的域名在所有递归解析服务器中没有域名解析的缓存时,就会回源来请求此域名的SOA记录,获取提供权威解析服务的地址。")]),a._v(" "),e("h3",{attrs:{id:"srv记录"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#srv记录"}},[a._v("#")]),a._v(" SRV记录")]),a._v(" "),e("p",[a._v("SRV记录即服务定位(SRV)资源记录,用于定义提供特定服务的服务器的位置,如主机(hostname),端口(port number)等。")]),a._v(" "),e("h3",{attrs:{id:"url转发"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#url转发"}},[a._v("#")]),a._v(" URL转发")]),a._v(" "),e("p",[a._v("URL转发,是将当前访问的域名指向另一个网络地址,可以分为显性转发和隐性转发两种。")]),a._v(" "),e("p",[a._v("显性URL:将域名指向另一个网络地址时,访问域名自动跳转至目标网址,地址栏显示为目标网站地址。")]),a._v(" "),e("p",[a._v("隐性URL:访问域名跳转到目标网站,但地址栏显示为原网站地址。")])])}),[],!1,null,null,null);t.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/24.e88ee896.js b/assets/js/24.e88ee896.js new file mode 100644 index 00000000..1714f3d2 --- /dev/null +++ b/assets/js/24.e88ee896.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{605:function(s,t,a){s.exports=a.p+"assets/img/20211209200719.5918a798.jpg"},606:function(s,t,a){s.exports=a.p+"assets/img/20211209200902.615be5d4.jpg"},714:function(s,t,a){"use strict";a.r(t);var e=a(7),n=Object(e.a)({},(function(){var s=this,t=s.$createElement,e=s._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("h2",{attrs:{id:"查找进程-结束进程"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#查找进程-结束进程"}},[s._v("#")]),s._v(" 查找进程 & 结束进程")]),s._v(" "),e("p",[s._v("任务管理器 -> 性能 -> 打开资源监视器")]),s._v(" "),e("p",[e("img",{attrs:{src:a(605),alt:""}})]),s._v(" "),e("p",[e("img",{attrs:{src:a(606),alt:""}})]),s._v(" "),e("div",{staticClass:"language-powershell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-powershell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /f 强制终止 ")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# /im image name的缩写,图像名")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# taskkill /f /im 进程名称")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# taskkill /f /pid 进程号")]),s._v("\ntaskkill "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("f "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("pid 11932\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br")])]),e("h2",{attrs:{id:"生成目录树"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#生成目录树"}},[s._v("#")]),s._v(" 生成目录树")]),s._v(" "),e("div",{staticClass:"language-powershell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-powershell"}},[e("code",[s._v("tree "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("/")]),s._v("F > 文档结构图"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("txt\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/25.00189df8.js b/assets/js/25.00189df8.js new file mode 100644 index 00000000..bada8010 --- /dev/null +++ b/assets/js/25.00189df8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{611:function(e,t,r){e.exports=r.p+"assets/img/20201110134001.c433f92e.jpg"},612:function(e,t,r){e.exports=r.p+"assets/img/20201110134002.fdc66a3f.jpg"},722:function(e,t,r){"use strict";r.r(t);var v=r(7),s=Object(v.a)({},(function(){var e=this,t=e.$createElement,v=e._self._c||t;return v("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[v("h2",{attrs:{id:"servlet-生命周期"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#servlet-生命周期"}},[e._v("#")]),e._v(" Servlet 生命周期")]),e._v(" "),v("p",[v("img",{attrs:{src:r(611),alt:""}})]),e._v(" "),v("p",[v("img",{attrs:{src:r(612),alt:""}})]),e._v(" "),v("p",[e._v("主要体现在三个方法上,init、service和destroy。")]),e._v(" "),v("h3",{attrs:{id:"初始化阶段"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#初始化阶段"}},[e._v("#")]),e._v(" 初始化阶段")]),e._v(" "),v("p",[e._v("Servlet容器加载Servlet,加载完成后,Servlet容器会创建一个Servlet实例,并调用init方法。init方法只会调用一次。Servlet容器会在以下几种情况下装载Servlet:")]),e._v(" "),v("p",[e._v("1、在Servlet容器启动时自动装载某些Servlet,如SpringBoot启动类做的事情;")]),e._v(" "),v("p",[e._v("2、在Servlet容器启动后,客户端首次向Servlet发送请求;")]),e._v(" "),v("p",[e._v("3、Servlet类文件被更新后,重新装载。")]),e._v(" "),v("h3",{attrs:{id:"处理客户端请求阶段"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#处理客户端请求阶段"}},[e._v("#")]),e._v(" 处理客户端请求阶段")]),e._v(" "),v("p",[e._v("每收到一个客户端请求,服务器都会产生一个新的线程去处理。")]),e._v(" "),v("h3",{attrs:{id:"终止阶段"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#终止阶段"}},[e._v("#")]),e._v(" 终止阶段")]),e._v(" "),v("p",[e._v("当Servlet容器终止运行,或者Servlet重新装载Servlet新实例时,Servlet容器会调用Servlet的destroy方法,由JVM的垃圾回收器进行垃圾回收的。")]),e._v(" "),v("h2",{attrs:{id:"servlet-工作原理"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#servlet-工作原理"}},[e._v("#")]),e._v(" Servlet 工作原理")]),e._v(" "),v("p",[e._v("客户端发送一个请求,Servlet调用service方法对请求进行响应。")]),e._v(" "),v("p",[e._v("Servlet和GenericServlet是不特定于任何协议的,所以Servlet和GenericServlet接口中没有doGet、doPost等方法。")]),e._v(" "),v("p",[e._v("HttpServlet是特定于Http协议的,在service方法中,将ServletRequest,ServletResponse强转为HttpRequest和HttpResponse,最后调用自己的service方法去完成响应。service方法会对请求的方法进行匹配,进入相应的逻辑层,完成请求的响应。")]),e._v(" "),v("h2",{attrs:{id:"servlet-隐射路径"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#servlet-隐射路径"}},[e._v("#")]),e._v(" Servlet 隐射路径")]),e._v(" "),v("p",[e._v("隐射路径优先级:完全路径匹配 > 目录匹配 > 扩展命名匹配")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/26.22faf91b.js b/assets/js/26.22faf91b.js new file mode 100644 index 00000000..0fe696c0 --- /dev/null +++ b/assets/js/26.22faf91b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{608:function(t,a){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdUAAACbCAYAAAA0nAFfAAAgAElEQVR4nO2dX2wj15XmP2cansSxk3mZhxaxMSFLIBabl24Okk6YdcuCI0NZNgcBgjSaGSIzaUHjXsEEJ4aM7sk6BHfQsGEtYIWA0Iag2YdlLMPZIMGwuVGag8haewi0B2H8kGBgQjQhx2EbBvISd2BkJ4m1909VsapYxT9iiaSk79cQRBXrVt3LYt/vnnPPPfeefcHdu3fxwAMP4CDcuXMHExMTByo7yH1HVZbtHc592d7hlGV7h3Nftnc4Zcehvfe8//77+we6SgAVOYqwvccbtvd4w/Yeb8ahvadkBY7iiIRlWZZlWZZlWXbcyn7kQFcghBBCSBsUVUIIISQgKKqEEEJIQFBUCSGEkICgqBJCCCEBQVElhBBCAoKiSgghhAQERZUQQggJCIoqIYQQEhAUVUIIISQgKKqEEEJIQFBUCSGEkICgqBJCCCEBwa3f+oTtPd6wvccbtvd4Mw7t5dZvLMuyLMuyLMuy3PqNEEIIGS8oqoSMAfUbl5BYrbUdr60mEI0m4PGWxa2rM55lCSHDh6JKThaltBCpNEqjroeLt94GZucjjmOldBTJxiKqm7PYTvrX+bFnNzC7nUR63BpFyAmEokrIISPFMeqneErko3jm9rsoJKPqdbpUQlr8ziKHaj4ORDJYSe0h62uxTiFTzAHZ8RssEHLSoKgSMkrieWGJpnD63DVUq1X1ei+7jslUDKhklcjKn2QBSKXCSnj9LdIK1ukGJmSkUFTJyUZaiolV1AyL8cKFC06r0vW+/rFZhLVVJFwWpJoHlWXEv9WEsDgrsATSSxBrW9t48BEgLcsIq7RYLSKTyWuRtX5ax6Tx2t6OMiqhEFBYo7VKyAihqBLSLCBZnlOCdfM7X0ZICKBD/Gzvy59crIKsEs1uRJApyvPFy1jORxBLWCuE8chjtiPpaEvA7feRwu5jppbKFYRmV5SbmNYqIaODokoIYsiZajf5DSwKEdyr17zfF8SXUgg1t7EVhHbV6thDBc/MPIOKFG9hBZflHXNSwHOIqXOENdxJxOs3sF6JYTETQSSziDCtVUJGBkWVkNAkpvt5PzKFcFD3Vu7eKnZ2riEWSmGzmsccpLdYWqpZVHq4xK2Nl4HUErTsx7FEa5WQkUFRJaRflHUZxlSk+6l9oSzVBNb3XJZqJ0ppPPP2RaxkWpXR1upyx7WthJDD4dRBCi0sLOCNN94Iui5kAM6cOYONjY1RV+N4IsRueXUeRSVcNawuF9CM5bRlqKzWAra3arh8eQJ6jrQprNsery1du0lxPflaWqrFDHbTUWSlpZrVx5Y6lc3u4eLGdTj1PY58roxoMo0pYfl6xTWRw4P94/gxzP7xQJYqvzDjB5/JISKEbRHLRvBQEoWwsX5UIQUsJnQ3iZmZGfF+GZMpp6KqOVi/6F+7+9d22GGpynOE2DqEUwYtCTEO54q4MuVR53gem2ptK9euDhv+Xxw/hvlMDmSpmshoRjJ6ZGdNekSuC413+FsdqrZZd9OZIqqZzte0J9XO2M9VwulX2Ie6XKojLFhpqdqs2VBqybJQU5tVSONZ3NaTiKzzlM4gBVqsQ4f943gw7P7xnmazuW/uVNMrci2fhF+a8cD80ty8edPz/X6fb1AMct9RlW1jO4cLm/8B39n4BiYP8b5j094h3fc4t5f943jRrX80Ceo7eWpiYkL9IX+To43fMxzk+d65c+fAZQe576jKtrX3z/5U/C+5H38ujnW74rFo75Due9LaS0ZPt2cX1HdyIPcvIcceD/cwIYT4wSU1hBBCSEBQVAkhhJCAoKgSQgghAUFRJYQQQgKCokoIIR786Ec/wuuvv44//OEPo64KOUIw+pcQQjyQWXh+8IMf4JOf/CQefvhhxGIxnD9/Hvfee++oq0bGGIoqIYR04De/+Y1KHCB/7r//fnzhC1/AF7/4RXz2s5/Fxz72sVFXj4wZFFVCCOmR3/72t/jxj3+sfu677z587nOfUwL7+c9/Hh//+MdHXT0yBlBUjxHMAUzI8Pjggw/wk5/8RP189KMfxWc+8xklsORkw0AlQggJiP39/VFXgYwYWqrHCL8E3vbdU/pl0FypB73vqMqyvcO571Fo7/Xr11Wgkh9+7t9vf/vbB6obOR5QVAkhpEfMQKVHH30U586dY6ASaeOUuV3NKLZSIsHS6RkO8nxZlmVPYtnf//736vcnPvEJZYnKTejPnj1rLamR61fZbx4denlWQXyvTpn7wB3UnULGB79neBTddCzLsqMuKwOP5ufnVQDgqVOn2E8ecbo9u6C+V3T/EkKIB1/60pdGXQVyBGH0LyGEEBIQFFVCCCEkICiqhBBCSEBQVAkhhJCAoKgSQgghAUFRJYQQQgKCokoIIYQEBEWVEEIICYgRi2oJ6WgUidWa97vpKKKJVXi/e/Bzh0PnthFCyKhQ/WW6dNDS7Ns6MNqMSrU69hDC7Hxk4EvFl1JYTxawvDqPYsZ+PfkFyKLiUSaWqyIfVxXBaiKJxqL5d/eyojRy1Tzinu/JL60sF0IqgLYRQsjYUCqzb+vASEW1trWNZmgWB3o2pTSiWQ+5KyQRLZh/iAe/uahetQRU3ngVieQ2JqfNv3eBcAiVrBh91TddoiyvUYRTp+W9O1UtCl21pqhOFAX/U9vrRgghY0JtNYFkoen5Xi99myKWQ/UEdXAjFNUatrbFw2oWkIw6H00o5RY2D+J5VOPSwlzDVNFlMUrRK88ZD1JYm66ipbUCmuJBW7eIxJER52aUWK6hlDGupyxpYLKPVrUEVdLBmlXCLuoRSmHp5HzfCCHDwuxjfE/IIuppHbT6rUimiGrG9pbqI/faDQ1iMbqt30prKDTdoqPdrXs9XySCqXAF2XRJaKxlhmJ1vYJQeE7Nr7Y9d/FFE2+LwZOHkimhtldRi15vlrR2IctBnbY89d/ZaAJ11xfQGv2Ja28WM+11PCDc+o1lWXZ8y44GD0+b0Vdtz3oYLx29cLpvhd0gOUIc+63fSuWKskgd0mZYhuEp+xNrYC2RxpzbGjXQc6nrWK3F9YM2xboY9xQrUyhXOlqHdoH0EL34HGLZrBBMYZXKv6V7Y64szrd/gSPIFKuYkpardJNIAV1sIGmYsT1Z433Crd9YlmXHs+yxQPWtoo8TnafTI+fPYfRzB+V4b/2mrMUYFvOuD3u3gaYMXJq2HWtWVKBQxcPiU0QyWIwVsL5VE+/tIi2etLQU/VyueqDVEkrnnIG2nKdXl10C6SaOfNV9hzjaDsmj+aq4nrxHQQiqPNLpuoQQcsjUtrDd7DdAtKT6VstKzfv0ser6pttZ9PEnsKMbiahKaxFuKxXSUN0TmuMKXFIu0nlsScsxmQAMQWobKVVsAUrZqOXCCKVSCJvnKNEWOl0uCbXTd7fmDGxuj7Z5hP5b6IgalqO1ajVie0/UT748YRP4hJDRowJEVRBlqz/thl7NILqsuU79VcvDd5L7tuGLqhCvrLBSc/mIFrL1SWNe0QhcCk95uG3trlTji9BppOS8IdKm2Mo502k5isoimkbHh96Te8OaE7V9mRTS4q0i71nIZuXK9tsnME7wF5EQMgSEFbksOio50F/BMpLJKBrdVh+oPrvrhV0xJQHW+YgxdFGVc6mme7Y2PYcUskhGG8htTiqXRKrDZKflSl1exfxBA3wiGRRzDWGV2uZhPe+1ibrfZL5piVoDAC36yrg1lvpY8609cNK/hISQYSD6raRe+VBVfVoR1SnZX3ktJTSQrtxsRXv8CtI6cRsQ7VRsnkJFwAGZ487QRTVuszAjkTgixWlARskmK+rD7+bmd7hm/daqGviKVXwJqXUhmGoe1u+GQigXYyhkl7E6747eXUdFWqO+Sti+lEZZvnBbolqcCSHkMDFjR9RUlL0zk947yH40iQSEsE45y5lTdcXMruHxsxkQzjv4RxSfMMYg9694SCsphGQAz8pBRjPa1Vp1/OTE0c73nAoDzcZu50tL8Q01UVi2pT8UQi6/nLGcfzYlQggZD3QCmqTSxqq34ElhzcXQLAgDou5+y6cM8WW0aQoVYoSzrEdD4/Ls5KhubaoorFw5KsuhIaxJNZVrLImRo73O7lo/96/3YuvOAwBCCDkoPa42MNfoC6OhpyxJxJeRi2opnRQPMYXNoSpqCWXPBBBaDCWhlJk6Io78Zl2FiMslMb3Nf9L9SwghJ5GRpilUE94Y0iR2fRWJaCtll1qUbM+eVDbnZp2C2FrHGkMsVtGT8Osna+KdEEJIb4xIVI3o2UCiwvwjbR1u1akMir6LT6VVGhJCu2LMH9jXmYbUXETLkNbv6XzFfrl9j4b795e//CVeeeUVfP3rXx9RDQgho6V9J662THc9lxX94bjM4Y2QEYiqkd/XHYV2YLyErV+3agTxfFEv8zEtU981o611psqlK8Wz7dzO28IdvJ6D02g0sL29rX5qNR1+RVEl5BgS6WRImHhlh+v1vF7LnixGIKq9P4h4twQPrgT43vfo78H3k03Js36+dfK8wlC+lLu7u3j99deVkEpRJYQQcjiMPFCJHA4///nPlWtXCuk777wz6uoQQsiJYHRbv5HAqVQqePXVV/Haa6/hvffe67lc1Ih4JoSQ48qx3/qNBM99992He++9F/fcc8+oq0IIIWPF8d76jRwKZ86cUT9PPvkkfvGLX1gBSd3cvzILlR937tzBxMTEgepzFPe9ZHuHc9/j3F56fk42FNVjyqc//Wn1k06n8bOf/YyBSoQQMgQoqieA6elpnD17FleuXMFbb71lBTCZS2oIIYQEA0X1hPHQQw+pn4WFBSv5AyGEkGAYg11qyKj41Kc+xcQPhBASIBRVQgghJCAoqoQQQkhAUFQJIYSQgKCoEkIIIQFBUSWEEEICgqJKCCGEBARFlRBCCAkIiiohhBASEKdkgmmZJFr+Jkcbv2c46PM9aNlB7juqspJxqvN27gJe+883kZ1tP/78T/8Cf3czi7/sct/t3AL2Uhv4xqT3++PU3sMuKxnVfclo6fbsgvpOnpI7NsjdFw66cwMZH/ye4SDPd9BdPUZetraKRLKApu39UGoTxUzEs+x4tbeGX78bw4W/msCE7dhqIont2U1UL6wh+vj38J9evIwz9vYuAyvFDMwW/tmfnsL9fy6uYV6klEa0PIdqPj5m7T38sqNqLxk93Z5dUN9Jun/J8UWKhxDUcK6qtrfTPzmEC0lE06XeryOFKprAaqD7D5SQjkbhV43aagLRaBKFZgVZcV5U3r8k66EFVQ0K4nnkwgUszFxFH60hhBwiFFVyTBGila0gJgRVGGQ24sgLYY1Vsr6CNg5EMkVUczFlVavBQC6MQraB2VQITTkoUEIbRbYSw8WLbwvhDVr0CSEHgbvUkONJqYxKKIXNuNebcczFssiWharG48KgFeKEnHKHGoWFFZkFpCBDWLtCnCWFZBQFec1iBhCWZLKxiM3JdSQLhnP59EVslp5SbldpaSa3Z9W52g3bctsW57daLumsEMdsDNd2ruMrbU3Yw+ycODe9i2I+j6pRvUzGeZ50PT31lLF5thTWZgHJaMF5UkXU3f53bK63z5EQ0he0VMmxpFbfA8JT8J45BaYnQ8BeHV2Nu7gQs80UQuJfalNYjLa5Sghrdxkrhlt5ExfxMpK9mL+RDIrSWhYvY8o1ncdjbQ1YxfreLOanrQNClKOWhWp3X9dvXELCNFPVte3u7ipyMaPu5rFcrHsdCSEHgqJKTi4dRLcnhNW6YgU8RXDlr88JoS0HM7+520BTWpzSohXiHU2soWEKuxJ56Dljl4hLCznRzQ8cn0MsqHoSQhwM5P6VI2ZCxpHIVBjY1paol3DuNpoeR/vELcoPPSjE7leDX1cSN9y9MkhqbQrF/LRyHysXtHw/lgvmPuTQYP94MjmQpXrmzJmg60EGhM/EhbTGhKW35mmOlVCuCKtvyXPC9eC89TaaoUlMdz+zP6SlGl3GtttSJWMJ/y+OH8N8JgeyVDc2NqzXg677kotmj1LZo9jek0kc+VwZ0WwUadgjgHUQUkVYennDzFTzqwXpDo3jLKRxuA4ZmtR15lFFEMeNa5dw9ZnbCKXS2nqVlnJhG1u1DCLyQGkNMp6pZzEstQKkpFVapaV6ZLD3jybsr4ZTdpD2BgWjf8nxRbpQp2XyBxlh2zqsgoNsRmoks4LUdlKtB5WEUikhqAX7CViMFZC1R//qC2Gu3Lr26YsbKJlzrHINqXgva4lgCqlQRVibVuWwlFpH0i/61+H+NQ9KS7WIDIxjxjlvPPeCo9lqyY0r+Lct+le0kPG/hAQPRZUcb1Q0bKbbScgUq5BnWSNd17qVeL4Ku7O45nFcjrA7lREXhf2qai1qxrusL1vCgi1UtKVqs2ZjuUjbNf2R1nq5t/sRQvqCokrIOCMHBXn9MlMs6t+WaMaVpardZf1cVCbA0HLPTLaEBAuX1BBCCCEBQUuVkAOg3KyjrgQhZOy45/33398f5AInLSqV7T3esL3HG7b3eDMO7T0lK3AUQ6dZlmVZlmVZlmXHrSznVAkhhJCA4JwqIYR0pYSrM1nc7uVUYy2zWuRUSiNRX8KLl42EBLYN4nvnFtLRVzFXzaN7Kb0bUmPRveWh+zQz/aXepak8J86fbm1wvyuObT28gzX31klyOVaijiXZPnuCkjZOI7VZQsYrR6gqt6fXXPsl35b1M3dy8iXU+RqO+9nqGcs5P3/jmexcPw/9+a1hqtjLZ+0NRZUQQnriHHLVtS6drRYdi3gei0KgLt3YQOmpw0mVp7YudGtb1pnwxIEh+iuTcvOFaSzKY3UhYutaUCNCWLb2Ynjkevd7y/1+i22qVsNz8SfNyvkKr5UdrHU1JZLm+MMxOGlDit+y44jn5yCRIlrN+7ZBbrGoU5b2uFa8CxRVQgg5EDqJRjcLMp7fxL8JcS091U2Qjav6iENFbkpvP2BYXPYkI5bVaRzwS9un9vtV+wAn9TUrWt6SCWBzBdhuVtCcmcEztnvlxJlmvSrRAmKxGJoVj+xdCmGpuurZmXaR9NwX2EGodQ/oZCtnHe01nk+ne8stFitN0Q6XwLs/644C74SiSgghh0oEV156FjKMRe3z2wMylaapBXfvfh/f+tqvtMvVPEG5LF2FlEDEMCss0GjUz3EaE9a2GAQYmbdMcbXfTx4Li79fPH8XD9z5R+0SFm9GhHTHXe7fxGTLUpXl5P7CMounZana0IMFu8vWyMOtBGu+vap9WqoHobRWUG0tWklU7tD9SwghQ8PDndmyIKVgLHY8VyN3HWr3zdqFzUG9gT3c26ViQmSWtUBk4q2sWy1LVQvYXmrJYdVmhQjHYk1UpLu4LC1KYGsb4n414Lxh8fW977AcRLyks3xFlpBaT6r2qpzbeejPJQkl7iqzl5w/FQeaUkTljUwvbF+Wqp5LLniMJdosfFOs5SBE2N9Fx2e+C7kr5FRf7XVCUSWEkF4xNzqQ1FqBPS3REeLlca655EJZho1FlzvUsLp89gys//OraDbfxVop4xt8VFtdFoIiRMbrGkbQD2zzn0pQIecadaCSUDgs1bWFG8vlEF7fQv3yZdwnFXbSZUUqsWtAnOaxeYPtb0O8zLzalvAJKdysTmFNiN26qpMzP7fSVJWze763oCuFzt/9VS/3r5973pYCNEgoqoQQ0jfaMmwKq0YJTI+RuVvbQrQW+3AsCkF8+uUHxfUfR1mIUKLuERgkzhFVQchzX8GGZcHahcmch5WCui5duOo9czMG0bb1Mt5CHb8Smjq7EoHDEjR3ahIDBHugUsv9G3Gt+TTLGvsBG9WXVqoso4W8XThLaeN+PQRd9WdJm9f3CWyCh3ULv6CsdiiqhBDSD6ZbV3boVWNpieyEY9p96l9uTVtpculKdBuz1tyidDmGMefur42lJxc3XhQC+ADiVb2nbrQh7jNnv6y81gqwvKx3MUp6KIVdmES9r4QLuGGeZgs20uIWwfzsHp68uoGPYBZKU62dnFzRzY010ZaKbemLeS0dKQ2HcDU9In6NKpj1E5+hXNpit6SdFqfrtVGXfgVSB085d5GSA4E7//g1aKO+h6U6PoxOVMUXZib7x+4h6p4uFuDW1Rm8Ot+LW6BrRfRkeS+nii/jd174KrRzwWM9mPxPsD7ZYeRUF2WysjHOB6b+86DH0S4hZFTUpWXlCuzRbl7dj6RLfpvH30Ja9PqxXF5tWq9dm8LynBXWz3wde6FJh/dXiYwS7TwmrG0BpbBtQnaIq/WwdW48L3cvEv2R/GM+79j6786df8H3Hv+eR+DNPH7r6L8MsTJOimQW8aBoz5/k1nytwN1GE+HJWeztufs8uaQmb9StZRHbo5IdGGt5TSvw+0tR/K/pTdEO00JWnSP09sLr2Eut6LbUxOdmfQb6fWsO+SB9av2GsPjDoswcyolV1A5oAY9OVMWHvvFvcSykS+Klf7NrW8r/YC2k7n/hdC/EevjwXSO02ha2xahzxb6GuCykuVlxTq7b3BP1G0+j0HxX+otaozW5efWelvSsfUTVUxg6IWSYTPnuV2tupyf6iXX3ezJxxDN4J7VpC4pp7eErLdhmeM7RgTuifx3XiugtAEVfWGgM0JDaLqZWhEAvmxasjspt2QdGoot1IS5xL3EpoVyJYW5JnLI9QD08eOzZHXzFnH+2D2CUmzuMxaqtNl5BVNIQcwiqHvDALxDMKHNp4VU8ullSZeIr4hpCWN3GXC8MQVT9o7I0HpFwlhDVsGX59LVoxeYOYWZZjHfWE2lAjebaLVA9VzCLsK2EcrkIizNiWtKLDeV+sP9n0PMV89aAYEHOjWw+inWb5a3OEaPV6vyWleGEEDKO3HYOfP0Q/deS+doIEvrw4gZKPv5EucwmNOkTpXRYROKIy7oZc6SpcAGFZBpT1SXUjWCijZ3LaH5rRq9ddYnLrrAYK7FF5FHHumeU7jm4bfZKh7nRUGqp9YewGBMLL6MZM92/5tKfsMP4kQZX0x2nu51D9Hv/UVn4Vn0Ni7Yp77/unoM19SmGazsvCTE3P58MilJYxfNGj3OpJkMQVfuIzGlp2iez5Ye2NlV0jiTkHERTfJDGmiZpCFYqtgdzu/W610lkb8ToZ2US68pqBhriAxb2P1anpZvWFPYpNLYNS1V8GcuTK8hHZJMaWCwuYSuxJh54DuVoGiV5Eenj3xMPMK+kE2LgJx7as4iL9qpRkLhXcUl8IcU5K+qciMpwki7FA3BpE0KCp8+MSlY6viouT9x1nuOYcpKesl76Lmc56Ur2P9W2nEcaKW1v6+U0uao5r5jR86XRJPZS2vUq++cz+SqmpaClp1rJH2IpTIo+MaXcdKsewUIt968d3yVDyv1r+3vqCorVp6xrKdELa4GtGe5344qi/nHbZcx51Z+2ewtFO1X9ai0LdNdaN6uDp+7edWVUiuioZDOYqleNGfLWb7dw9VIDCy9dcY0v6rhxaQOTLz2LxxzHFvDyu+eUGD104xIW3v5r7Dyrz5Bzqq88soNnH8OAiDrNvIJHxD0gryn+47z94AJe+uI/49LTwD/8A/C0/P3SJDZE3S+t/xU+/t1FYXW+q0qfuybqgKu41BBlrkypUdYlMcp699w1q666OcbxXqp0+iI22j6j0TAOWykNE7b3eMP2Hm/Gor37AimsB6XZbPZ1/s0nzu4/cVO/tu5784n9s+ZBgzefvyCOPbH/xNkn9m/uv7n//AX5u8X//q+t6/SLs703jXuom+5fOHth//k3bXU4a95HnHfh+f3XrPa+uf/mm+1t0+fL+p61lfW6r3E/cU3XZXqoc38M8/kGdV+2dzhl2d7h3JftHU7ZcWjv0AOV4ksprCe1i/S8OiJdo9JF4vQL7DbCyOXnUFa5uKQL+TDmUl3sNtAU/7a3ashEIojMzyJUaFgRcS2854mtjCGSuBF+HpWZSr6MWOWHvhHGnllDBlh/RQghZDQMP/o3ksFKSvroS9i5HrLCpd2u6nhe5bOCTm/ps+zltnPt1WAiZIp7Do3lLdREhXbX9IrqrDHX2jp1zVjI3FoaoybSvSbiZb3ysl7/rbNrwmfpECGEkKPDSJbURDJFbAoRmpkxJn+7BuaY4eot5FqmYNapaupmNFskjtpsAmvphhDxHKrFaZVCbLVmy+lpT1Vmo20i2xBK/dLcFaIzptXqO6lPCBk5JTMQ0TUINoNldF8AnX5wRW9nZs84ZCvhSqXXbbWEDdOQ6LivaTutvsWWHN/ZOlWnh3euo207Vd96d8O1qqKTEWFG/3pdxmE81azP1zt+yOP9LssyO66n7ZHRrFMVDZMCc+7cOdwuJJHAIJG7QVBBoRCyXNBy4bMMR9s01D6zGEZ0rYwYJm1lbF/+WA6bk+1XtSMHEjuXjV0fkvZsKublaKkSMs7I4MhnjF3KpWhWdfi/Q9Cs44qao3wks4JZOUCf75Stx7ZawkDtUjPTYZNy1yDfvpLiznf/Fo//+pvB96+lsjBC5tDzpJxc19+MoacMjWb0r1qO1MCiq92yfQljNxyrOh4ZldTgobiopuDS8jV8BNU9KKm4PI59ekGHKqpWw41NY013qDwulwMNnvCg39GTiTv5g7CMi7a35Zd22m11wpHHUmb6aE8uDfVAHFiJohNY9R1hEULGEU8PUs/9VsQYoJeQ8Tu/g9XplW5P18fLurULQ3uS+/Zup/0aFWs/VXf/WFLZoaQx4swxEPJN76fWlMYWO/TLNYdVr+5ibMsW72qRtjIqffdvo/jXC4aA2qfj5GvdKl1n9+dgpEf8v9+acVmqrqQ/PTDU5A+OQB4b1ia7KoemR4N7RohhriyukUB9gNyNdhwjIPHBS4N0wierSif3rxMjK4ra8qhguTlkeWosIceYuNwKTU4nxVv9kytFoVuk/SxV5aq0/moJmq+lauuP7P2a3HBc9V2WhWxz/3rEgNTUVJlrIGFYlVOeHVgJa8oI8QT35j0AAAaESURBVJdUlTxfrkVV60V1G1TuX1VE9Jcrs6Luq5gveqazsu7z2jtfxjdVGW29l9JCC5baPxc/5Iby9YSwbHFwF/Bwkz90o22usn0u1USnsvK5hhylGA+gu0j530Nfzpl0WeaW9EK6d4vtB1FsO+h63zvnGSFkDHFkBYo5E9v3hjGgNrHlr1XETTFoid65a9fwJ/KF3Yr1SAjfD7pfa82p7preQhstSxWO+Vud2ch5546WqHQVi19+M2RKQNX8tFm6rnbzQbM9297y6jxW/Bol7vPO57/q2Mh9fXIFi2tCJOdywPYslualIWO4lB1egQpEc1u4gk7lwKNXj8Tx3KXGJ5CIEEIGwXL/qoAX42DFL9XqvLt4O3IZnyvvr8Q+mFfTZF/RIUNx337NvQOMv/vXC7fxoO77xnP4WvZeW5yH3BLOK0l9J0tUlpHC5bkvHbaEmBfaAr6mfA2xWq0mCnldSd/nvWYF0R9C7QmL8hyKS1vCwk1hsV5GfUXuwJ5oib9tACO3v3vx8s/xrZlnXDmC/YK5/DmeokoIIcPCsmDcHXDNu/+34cz720fkr0nbRuC2PVIzkdauLX4YeXtDoRCaTe8bJ21Wmle+AJl8vyLzHXvNpcrN08MppOCRdV/cW22F10mwXAGckUhExjx530dU/y/+7ia++evHsVYW1nFFCKyKxM6hvi3uVZCDjpBN/FuJ9qWRfPfuBPLVr6jPLy0zF2eNZZyi7f1kSaCoEkJIjzjdv337fl1oC29205QU76myu99fwtd+lfaJ4K2pLeSSbj2seARNmoT+i7DU/g9Ktg3Hva7cbql63F26bisxxGIFrJUybfOQOonPPOqJbUcZtbzQ794eS2qSrQ1fPVZayPzsYVGHJv6feWhOWKF5+dmsYSoTR1z8mHvBzls39J76s6x2f7dARyiqhBDSlRoab58WVk5JBxgZ7l+5c1ZocqlraaB9bauy8MTviisa2HtN++12kbSsR0OIPZagSEv17vceR3J71iVg/13YYs7I1n7XaDp2jlH3NjchaZ2jk/gYe73u6h175K4v1c2t9iBOYz/qjRdtCfU9lhrKQCknOuOerP9NRwW30Jhdag1SSmXsib8dIm7sItTZOeAf1ezFR3o7jRBCTjK7ePvdB1vRrXI+TuhFuRLC7Hyn3lbPdc7MzLgE1RDYalXt/pJYda5pVSslxHubqRBOX9ywXqt1sOJ1NRdru1Npq4FwqKK2p4uKn8RqCf9z4YKHoHojLbS5chTpUvdPQ9bfsRWbDLrMhdX2cb7Fp2VgZtV3zax0hcv9UbttJKKCQntQuNJaA3MqAYcQ+5rU1D3xrHaRjrrqaOxis3PtnLHcU3/W+hlsIuU9HewLRZUQQrohrJzb5x5xLWnJqixsvv27SnigBXJnZwdVKWw1vUenWi5iCF08n0O4kOxJzDoRz+SRL0ohyEFKbrOQxQ/fg5437fHiUlgdlqp7E3C17NGovztgSQ405FSkeP/qrf7rv9toeu8rq+Z99UAhmlh1pdRw8tPnL2grv76KdcyJ+kUwPwtsb62iDPmspjEpBh7lAT/rTpwy95Br20uuD1iWZVmWZY9z2VvCCry4cL1Vtn4DL1TktpTnbdf7Hf744b/jA/G3OjJxGS/uXJZ3VO++8VwcCy8DFzd2IHeJbJU7j+sbF3Hp6efwxvkrwL9/iD/+7q5ar/mBeG3WWb7+EP+EpejLkImdTl/8G32NW1cxY6Z6Ush67eA6bFuhiXNUhLKxreRbZnaoc9dw3awvzKZdsra2lFayWU+dUUpf+zG/z/H8dTGAkNtpziD6irn95QeiSaIdH+g2KSbO4wsfLrg2EzmNi38zoetqtee09XlZvPEc4uY2mrI9E/q6v/ujDlT6H3+p2ztTKNiisrWL11o29MLf4+9fuIVbxl6crXrctpWxzZ/LyOouW3Kan8c9cquaQfag6xpd1oFB7juqsmzvcO7L9g6nLNs7nPuyvcMpOw7tpfuXEEIICQiKKiGEEBIQFFVCCCEkICiqhBBCSEBQVAkhhJCAoKgSQgghAUFRJYQQQgKCokoIIYQEBEWVEEIICQiKKiGEEBIQFFVCCCEkICiqhBBCSEBQVAkhhJCAuKfZbO7L7PqDbKV0UAa576jKDgLbO/5lB4HtHf+yg8D2jn/ZQQiqztz6rU/Y3uHcl+0dTlm2dzj3ZXuHU3Yc2kv3LyGEEBIQFFVCCCEkIP4/d5CWT6dJjSIAAAAASUVORK5CYII="},609:function(t,a,s){t.exports=s.p+"assets/img/20210307230052.f6a5d002.png"},718:function(t,a,s){"use strict";s.r(a);var r=s(7),e=Object(r.a)({},(function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"概念"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#概念"}},[t._v("#")]),t._v(" 概念")]),t._v(" "),r("p",[r("strong",[t._v("IO,Input/Output,输入/输出")]),t._v(",以内存为中心,"),r("strong",[t._v("用于处理设备之间的数据传输。")])]),t._v(" "),r("img",{attrs:{src:s(608),align:"left"}}),t._v(" "),r("h2",{attrs:{id:"分类"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#分类"}},[t._v("#")]),t._v(" 分类")]),t._v(" "),r("ul",[r("li",[r("p",[r("strong",[t._v("以流向划分:输入流、输出流")])])]),t._v(" "),r("li",[r("p",[r("strong",[t._v("以单位划分:字节流、字符流")])]),t._v(" "),r("blockquote",[r("p",[t._v("单位换算:1byte=8bit,1char=2byte=16bit")])])]),t._v(" "),r("li",[r("p",[r("strong",[t._v("以角色划分:节点流、处理流")])])])]),t._v(" "),r("table",[r("thead",[r("tr",[r("th",{staticStyle:{"text-align":"center"}},[t._v("4个抽象类")]),t._v(" "),r("th",{staticStyle:{"text-align":"center"}},[t._v("字节流")]),t._v(" "),r("th",{staticStyle:{"text-align":"center"}},[t._v("字符流")])])]),t._v(" "),r("tbody",[r("tr",[r("td",{staticStyle:{"text-align":"center"}},[r("strong",[t._v("输入流")])]),t._v(" "),r("td",{staticStyle:{"text-align":"center"}},[r("strong",[t._v("InputStream")])]),t._v(" "),r("td",{staticStyle:{"text-align":"center"}},[r("strong",[t._v("Reader")])])]),t._v(" "),r("tr",[r("td",{staticStyle:{"text-align":"center"}},[r("strong",[t._v("输出流")])]),t._v(" "),r("td",{staticStyle:{"text-align":"center"}},[r("strong",[t._v("OutputStream")])]),t._v(" "),r("td",{staticStyle:{"text-align":"center"}},[r("strong",[t._v("Writer")])])])])]),t._v(" "),r("img",{attrs:{src:s(609),align:"left"}}),t._v(" "),r("blockquote",[r("p",[t._v("对于文本文件,使用字符流处理,如:.txt、.java等")]),t._v(" "),r("p",[t._v("对于非文本文件,使用字节流处理,如:图片、视频、音频、word、excel、ppt、pdf等")])]),t._v(" "),r("h2",{attrs:{id:"使用"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#使用"}},[t._v("#")]),t._v(" 使用")]),t._v(" "),r("div",{staticClass:"language-java line-numbers-mode"},[r("pre",{pre:!0,attrs:{class:"language-java"}},[r("code",[r("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 1、创建流")]),t._v("\n"),r("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v(" "),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),r("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 2、读或写 ")]),t._v("\n"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),r("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),r("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOException")]),t._v(" e"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\te"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),r("span",{pre:!0,attrs:{class:"token function"}},[t._v("printStackTrace")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),r("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("finally")]),t._v(" "),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),r("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 3、关闭流")]),t._v("\n"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),r("div",{staticClass:"line-numbers-wrapper"},[r("span",{staticClass:"line-number"},[t._v("1")]),r("br"),r("span",{staticClass:"line-number"},[t._v("2")]),r("br"),r("span",{staticClass:"line-number"},[t._v("3")]),r("br"),r("span",{staticClass:"line-number"},[t._v("4")]),r("br"),r("span",{staticClass:"line-number"},[t._v("5")]),r("br"),r("span",{staticClass:"line-number"},[t._v("6")]),r("br"),r("span",{staticClass:"line-number"},[t._v("7")]),r("br"),r("span",{staticClass:"line-number"},[t._v("8")]),r("br")])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/27.1229c8fe.js b/assets/js/27.1229c8fe.js new file mode 100644 index 00000000..a184dfc5 --- /dev/null +++ b/assets/js/27.1229c8fe.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{632:function(s,e,t){s.exports=t.p+"assets/img/20240623141828.6fc4adcb.jpg"},633:function(s,e,t){s.exports=t.p+"assets/img/20240621232903.e7edab1d.png"},740:function(s,e,t){"use strict";t.r(e);var n=t(7),a=Object(n.a)({},(function(){var s=this,e=s.$createElement,n=s._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("h2",{attrs:{id:"ssh-简介"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ssh-简介"}},[s._v("#")]),s._v(" SSH 简介")]),s._v(" "),n("p",[s._v("SSH(Secure Shell)是一种能够以安全方式提供远程登录的协议,也是目前远程管理Linux系统的首选方式。")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://www.openssh.com/",target:"_blank",rel:"noopener noreferrer"}},[s._v("OpenSSH"),n("OutboundLink")],1),s._v(" 是 SSH 协议的免费开源实现。")]),s._v(" "),n("p",[s._v("OpenSSH is the premier connectivity tool for remote login with the SSH protocol. It encrypts all traffic to eliminate eavesdropping, connection hijacking, and other attacks. In addition, OpenSSH provides a large suite of secure tunneling capabilities, several authentication methods, and sophisticated configuration options.")]),s._v(" "),n("p",[s._v("The OpenSSH suite consists of the following tools:")]),s._v(" "),n("ul",[n("li",[s._v("Remote operations are done using "),n("a",{attrs:{href:"https://man.openbsd.org/ssh.1",target:"_blank",rel:"noopener noreferrer"}},[s._v("ssh"),n("OutboundLink")],1),s._v(", "),n("a",{attrs:{href:"https://man.openbsd.org/scp.1",target:"_blank",rel:"noopener noreferrer"}},[s._v("scp"),n("OutboundLink")],1),s._v(", and "),n("a",{attrs:{href:"https://man.openbsd.org/sftp.1",target:"_blank",rel:"noopener noreferrer"}},[s._v("sftp"),n("OutboundLink")],1),s._v(".")]),s._v(" "),n("li",[s._v("Key management with "),n("a",{attrs:{href:"https://man.openbsd.org/ssh-add.1",target:"_blank",rel:"noopener noreferrer"}},[s._v("ssh-add"),n("OutboundLink")],1),s._v(", "),n("a",{attrs:{href:"https://man.openbsd.org/ssh-keysign.8",target:"_blank",rel:"noopener noreferrer"}},[s._v("ssh-keysign"),n("OutboundLink")],1),s._v(", "),n("a",{attrs:{href:"https://man.openbsd.org/ssh-keyscan.1",target:"_blank",rel:"noopener noreferrer"}},[s._v("ssh-keyscan"),n("OutboundLink")],1),s._v(", and "),n("a",{attrs:{href:"https://man.openbsd.org/ssh-keygen.1",target:"_blank",rel:"noopener noreferrer"}},[s._v("ssh-keygen"),n("OutboundLink")],1),s._v(".")]),s._v(" "),n("li",[s._v("The service side consists of "),n("a",{attrs:{href:"https://man.openbsd.org/sshd.8",target:"_blank",rel:"noopener noreferrer"}},[s._v("sshd"),n("OutboundLink")],1),s._v(", "),n("a",{attrs:{href:"https://man.openbsd.org/sftp-server.8",target:"_blank",rel:"noopener noreferrer"}},[s._v("sftp-server"),n("OutboundLink")],1),s._v(", and "),n("a",{attrs:{href:"https://man.openbsd.org/ssh-agent.1",target:"_blank",rel:"noopener noreferrer"}},[s._v("ssh-agent"),n("OutboundLink")],1),s._v(".")])]),s._v(" "),n("h2",{attrs:{id:"ssh-环境搭建"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ssh-环境搭建"}},[s._v("#")]),s._v(" SSH 环境搭建")]),s._v(" "),n("p",[s._v("查看系统是否已经安装OpenSSH:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查系统上是否存在sshd进程")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ps")]),s._v(" aux "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" sshd\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查系统是否安装了OpenSSH客户端,如果SSH客户端已安装并正确配置,它将显示路径:/usr/bin/ssh")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("which")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ssh")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查系统是否安装了OpenSSH")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -qa "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" openssh\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查系统是否安装了OpenSSH服务端")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -qa "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" openssh-server\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查系统是否安装了OpenSSH客户端")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -qa "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" openssh-clients\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看版本")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ssh")]),s._v(" -V\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("p",[s._v("如果在一台Linux主机上通过ssh命令登录另一台主机,需要安装SSH的客户端,这在最小化系统中并不默认安装,所以需要手动更新安装。")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("yum "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" openssh-clients -y\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("被登录的主机,需要安装SSH的服务端,可以按照以下步骤进行操作:")]),s._v(" "),n("ol",[n("li",[n("p",[s._v("安装OpenSSH软件包(通常在Linux系统中已经默认安装)。")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("yum "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" openssh-server -y\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])])]),s._v(" "),n("li",[n("p",[s._v('打开SSH服务的配置文件,该文件位于/etc/ssh/sshd_config目录下,名为"sshd_config"。sshd_config 是 SSH 守护程序(sshd)的配置文件,用于定义 SSH 服务器的行为。')]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 从根目录开始递归搜索所有目录,查找名为 sshd_config 的文件")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("find")]),s._v(" / -name sshd_config\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])])]),s._v(" "),n("li",[n("p",[s._v("使用编辑器(比如vi或nano)打开sshd_config文件并修改相关设置。")])]),s._v(" "),n("li",[n("p",[s._v("常见的配置选项:")]),s._v(" "),n("div",{staticClass:"language-properties line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-properties"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 指定SSH连接所使用的端口号,默认为22")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("Port")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("22")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 允许root用户登录")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("PermitRootLogin")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("yes")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启用密码认证")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("PasswordAuthentication")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("yes")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启用公钥认证")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("PubkeyAuthentication")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("yes")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 公钥认证文件")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("AuthorizedKeysFile")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v(".ssh/authorized_keys")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启用RSA认证")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("RSAAuthentication")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("yes")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Match配置:")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# https://www.cnblogs.com/joshua317/p/14148694.html")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# https://segmentfault.com/a/1190000014822400")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br")])])]),s._v(" "),n("li",[n("p",[s._v("保存并关闭sshd_config文件。")])]),s._v(" "),n("li",[n("p",[s._v("重新启动SSH服务。")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看SSH服务运行状态")]),s._v("\nsystemctl status sshd.service\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动SSH服务")]),s._v("\nsystemctl start sshd.service\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 停止SSH服务")]),s._v("\nsystemctl stop sshd.service\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重启SSH服务")]),s._v("\nsystemctl restart sshd.service\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])])])]),s._v(" "),n("h3",{attrs:{id:"远程登录命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#远程登录命令"}},[s._v("#")]),s._v(" 远程登录命令")]),s._v(" "),n("p",[s._v("远程登录命令格式:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ssh")]),s._v(" 用户名@主机地址\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("远程登录可以使用密码登录和无密码登录(公钥登录)。")]),s._v(" "),n("h3",{attrs:{id:"使用密码登录"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#使用密码登录"}},[s._v("#")]),s._v(" 使用密码登录")]),s._v(" "),n("p",[s._v("使用密码登录远程主机:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost0132 ~"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ssh root@192.168.1.31")]),s._v("\nThe authenticity of "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("host")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'192.168.1.31 (192.168.1.31)'")]),s._v(" can"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("'t be established.\nECDSA key fingerprint is SHA256:NLUDWgWXkB6X0A2032EYKLX2kIOHTutiRnhPE8ik3Jg.\nECDSA key fingerprint is MD5:c6:72:64:93:07:2d:b5:fd:d5:2b:5e:31:c7:03:da:16.\nAre you sure you want to continue connecting (yes/no)? yes\nWarning: Permanently added '")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".1.31"),n("span",{pre:!0,attrs:{class:"token string"}},[s._v("' (ECDSA) to the list of known hosts.\nroot@192.168.1.31'")]),s._v("s password: \nLast login: Sun Jun "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("23")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("12")]),s._v(":43:22 "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("2024")]),s._v(" from "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".1.102\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost0131 ~"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("h3",{attrs:{id:"使用公钥登录"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#使用公钥登录"}},[s._v("#")]),s._v(" 使用公钥登录")]),s._v(" "),n("p",[s._v("SSH 公钥登录的原理涉及到公钥和私钥的生成以及使用。SSH 公钥登录的过程如下:")]),s._v(" "),n("ul",[n("li",[n("p",[s._v("用户生成一对公钥和私钥。")])]),s._v(" "),n("li",[n("p",[s._v("用户将自己的公钥添加到远程服务器的~/.ssh/authorized_keys文件中。")])]),s._v(" "),n("li",[n("p",[s._v("用户尝试通过SSH登录远程服务器时,服务器收到用户的公钥请求。")])]),s._v(" "),n("li",[n("p",[s._v("服务器检查~/.ssh/authorized_keys文件中是否有用户提供的公钥,如果有,则生成一个随机字符串,并使用用户的公钥加密。")])]),s._v(" "),n("li",[n("p",[s._v("服务器将加密的字符串发送给用户。")])]),s._v(" "),n("li",[n("p",[s._v("用户接收到加密字符串后,使用自己的私钥解密,然后将解密后的字符串发送回服务器。")])]),s._v(" "),n("li",[n("p",[s._v("服务器验证解密后的字符串与原始字符串匹配,如果匹配,则授权用户登录。")])])]),s._v(" "),n("p",[n("img",{attrs:{src:t(632),alt:""}})]),s._v(" "),n("p",[n("strong",[s._v("从A登录到B和C,需要在A上生成密钥对,把A的公钥复制到B和C上,就可以实现A免密登录B和C。命令主要是:")])]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" ~\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ls")]),s._v(" -al\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 如果 ~/.ssh 不存在,创建 .ssh 并设置文件夹权限为700")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" .ssh\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("700")]),s._v(" ~/.ssh\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 生成密钥对")]),s._v("\nssh-keygen -t rsa -b "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4096")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将公钥上传到远程服务器。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 原理是把当前登录用户的 ~/.ssh/id_rsa.pub 追加到要访问的远程服务器的 ~/.ssh/authorized_kes 文件中。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ssh-copy-id user@remote_server")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 如果远程服务器的 ~/.ssh/authorized_kes 不存在,需要先创建并设置文件夹权限为600")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("touch")]),s._v(" authorized_keys\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("600")]),s._v(" ~/.ssh/authorized_keys\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 公钥登录远程服务器")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ssh")]),s._v(" user@remote_server\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 公钥登录远程服务器,-i或--identity-file 指定私钥路径")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ssh")]),s._v(" -i /path/to/your/private_key user@remote_server\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br")])]),n("h2",{attrs:{id:"ssh-生成密钥对"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ssh-生成密钥对"}},[s._v("#")]),s._v(" SSH 生成密钥对")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://www.ssh.com/academy/ssh/keygen",target:"_blank",rel:"noopener noreferrer"}},[s._v("ssh-keygen"),n("OutboundLink")],1),s._v(" is a tool for creating new authentication key pairs for SSH. Such key pairs are used for automating logins, single sign-on, and for authenticating hosts.")]),s._v(" "),n("p",[s._v("The simplest way to generate a key pair is to run "),n("code",[s._v("ssh-keygen")]),s._v(" without arguments.")]),s._v(" "),n("p",[s._v("First, the tool asked where to save the file. SSH keys for user authentication are usually stored in the user's "),n("code",[s._v(".ssh")]),s._v(" directory under the home directory. However, in enterprise environments, the location is often different. The default key file name depends on the algorithm, in this case "),n("code",[s._v("id_rsa")]),s._v(" when using the default RSA algorithm. It could also be, for example, "),n("code",[s._v("id_dsa")]),s._v(" or "),n("code",[s._v("id_ecdsa")]),s._v(".")]),s._v(" "),n("p",[s._v("Then it asks to enter a "),n("a",{attrs:{href:"https://www.ssh.com/ssh/passphrase",target:"_blank",rel:"noopener noreferrer"}},[s._v("passphrase"),n("OutboundLink")],1),s._v(". The passphrase is used for encrypting the key, so that it cannot be used even if someone obtains the private key file. The passphrase should be cryptographically strong. Our "),n("a",{attrs:{href:"https://www.ssh.com/iam/password/generator",target:"_blank",rel:"noopener noreferrer"}},[s._v("online random password generator"),n("OutboundLink")],1),s._v(" is one possible tool for generating strong passphrases.")]),s._v(" "),n("p",[s._v("SSH supports several public key algorithms for authentication keys. These include:")]),s._v(" "),n("ul",[n("li",[n("code",[s._v("rsa")]),s._v(" - an old algorithm based on the difficulty of factoring large numbers. A key size of at least 2048 bits is recommended for RSA; 4096 bits is better. RSA is getting old and significant advances are being made in factoring. Choosing a different algorithm may be advisable. It is quite possible the RSA algorithm will become practically breakable in the foreseeable future. All SSH clients support this algorithm.")]),s._v(" "),n("li",[n("code",[s._v("dsa")]),s._v(" - an old US government Digital Signature Algorithm. It is based on the difficulty of computing discrete logarithms. A key size of 1024 would normally be used with it. DSA in its original form is no longer recommended.")]),s._v(" "),n("li",[n("code",[s._v("ecdsa")]),s._v(" - a new Digital Signature Algorithm standarized by the US government, using elliptic curves. This is probably a good algorithm for current applications. Only three key sizes are supported: 256, 384, and 521 (sic!) bits. We would recommend always using it with 521 bits, since the keys are still small and probably more secure than the smaller keys (even though they should be safe as well). Most SSH clients now support this algorithm.")]),s._v(" "),n("li",[n("code",[s._v("ed25519")]),s._v(" - this is a new algorithm added in OpenSSH. Support for it in clients is not yet universal. Thus its use in general purpose applications may not yet be advisable.")])]),s._v(" "),n("p",[s._v("The algorithm is selected using the "),n("code",[s._v("-t")]),s._v(" option and key size using the "),n("code",[s._v("-b")]),s._v(" option. The following commands illustrate:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ssh-keygen -t rsa -b "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("4096")]),s._v("\nssh-keygen -t dsa \nssh-keygen -t ecdsa -b "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("521")]),s._v("\nssh-keygen -t ed25519\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br")])]),n("p",[s._v("Normally, the tool prompts for the file in which to store the key. However, it can also be specified on the command line using the "),n("code",[s._v("-f ")]),s._v(" option.")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ssh-keygen -f ~/tatu-key-ecdsa -t ecdsa -b "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("521")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("To use public key authentication, the public key must be copied to a server and installed in an "),n("a",{attrs:{href:"https://www.ssh.com/ssh/authorized_keys",target:"_blank",rel:"noopener noreferrer"}},[s._v("authorized_keys"),n("OutboundLink")],1),s._v(" file. This can be conveniently done using the "),n("a",{attrs:{href:"https://www.ssh.com/ssh/copy-id",target:"_blank",rel:"noopener noreferrer"}},[s._v("ssh-copy-id"),n("OutboundLink")],1),s._v(" tool. Like this:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[s._v("ssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("Once the public key has been configured on the server, the server will allow any connecting user that has the private key to log in. During the login process, the client proves possession of the private key by digitally signing the key exchange.")]),s._v(" "),n("p",[s._v("Here's a summary of commonly used options to the keygen tool:")]),s._v(" "),n("p",[n("strong",[s._v("-b")]),s._v(" “Bits” This option specifies the number of bits in the key. The regulations that govern the use case for SSH may require a specific key length to be used. In general, 2048 bits is considered to be sufficient for RSA keys.")]),s._v(" "),n("p",[n("strong",[s._v("-e")]),s._v(" “Export” This option allows reformatting of existing keys between the OpenSSH key file format and the format documented in "),n("a",{attrs:{href:"https://tools.ietf.org/html/rfc4716",target:"_blank",rel:"noopener noreferrer"}},[s._v("RFC 4716"),n("OutboundLink")],1),s._v(", “SSH Public Key File Format”.")]),s._v(" "),n("p",[n("strong",[s._v("-p")]),s._v(" “Change the passphrase” This option allows changing the passphrase of a private key file with "),n("code",[s._v("**[-P old_passphrase]**")]),s._v(" and "),n("code",[s._v("**[-N new_passphrase]**")]),s._v(", "),n("code",[s._v("**[-f keyfile]**")]),s._v(".")]),s._v(" "),n("p",[n("strong",[s._v("-t")]),s._v(" “Type” This option specifies the type of key to be created. Commonly used values are: "),n("strong",[s._v("- rsa")]),s._v(" for "),n("a",{attrs:{href:"https://en.wikipedia.org/wiki/RSA_(cryptosystem)",target:"_blank",rel:"noopener noreferrer"}},[s._v("RSA"),n("OutboundLink")],1),s._v(" keys "),n("strong",[s._v("- dsa")]),s._v(" for "),n("a",{attrs:{href:"https://en.wikipedia.org/wiki/Digital_Signature_Algorithm",target:"_blank",rel:"noopener noreferrer"}},[s._v("DSA"),n("OutboundLink")],1),s._v(" keys "),n("strong",[s._v("- ecdsa")]),s._v(" for "),n("a",{attrs:{href:"https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm",target:"_blank",rel:"noopener noreferrer"}},[s._v("elliptic curve DSA"),n("OutboundLink")],1),s._v(" keys")]),s._v(" "),n("p",[n("strong",[s._v("-i")]),s._v(' "Input" When '),n("em",[s._v("ssh-keygen")]),s._v(" is required to access an existing key, this option designates the file.")]),s._v(" "),n("p",[n("strong",[s._v("-f")]),s._v(' "File" Specifies name of the file in which to store the created key.')]),s._v(" "),n("p",[n("strong",[s._v("-N")]),s._v(' "New" Provides a new passphrase for the key.')]),s._v(" "),n("p",[n("strong",[s._v("-P")]),s._v(' "Passphrase" Provides the (old) passphrase when reading a key.')]),s._v(" "),n("p",[n("strong",[s._v("-c")]),s._v(' "Comment" Changes the comment for a keyfile.')]),s._v(" "),n("p",[n("strong",[s._v("-p")]),s._v(" Change the passphrase of a private key file.")]),s._v(" "),n("p",[n("strong",[s._v("-q")]),s._v(" Silence ssh-keygen.")]),s._v(" "),n("p",[n("strong",[s._v("-v")]),s._v(" Verbose mode.")]),s._v(" "),n("p",[n("strong",[s._v("-l")]),s._v(' "Fingerprint" Print the fingerprint of the specified public key.')]),s._v(" "),n("p",[n("strong",[s._v("-B")]),s._v(' "Bubble babble" Shows a "bubble babble" (Tectia format) fingerprint of a keyfile.')]),s._v(" "),n("p",[n("strong",[s._v("-F")]),s._v(" Search for a specified hostname in a known_hosts file.")]),s._v(" "),n("p",[n("strong",[s._v("-R")]),s._v(" Remove all keys belonging to a hostname from a known_hosts file.")]),s._v(" "),n("p",[n("strong",[s._v("-y")]),s._v(" Read a private OpenSSH format file and print an OpenSSH public key to stdout.")]),s._v(" "),n("p",[s._v("This only listed the most commonly used options. For full usage, including the more exotic and special-purpose options, use the "),n("code",[s._v("man ssh-keygen")]),s._v(" command.")]),s._v(" "),n("h2",{attrs:{id:"sftp-服务器搭建"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#sftp-服务器搭建"}},[s._v("#")]),s._v(" SFTP 服务器搭建")]),s._v(" "),n("p",[s._v("SFTP(Secure File Transfer Protocol )是一个可以为文件进行安全传输的网络协议。")]),s._v(" "),n("p",[n("img",{attrs:{src:t(633),alt:""}})]),s._v(" "),n("p",[s._v("SFTP和FTP的区别")]),s._v(" "),n("ul",[n("li",[s._v("链接方式:FTP 使用 TCP 端口21建立连接。SFTP 是在客户端和服务器之间通过SSH协议(TCP端口22)建立的安全连接来传输文件。")]),s._v(" "),n("li",[s._v("安全性:SFTP 使用加密传输认证信息和传输的数据,使用 SFTP 相对于 FTP 安全")]),s._v(" "),n("li",[s._v("效率:SFTP 使用加密解密技术,传输效率比普通的 FTP 要低得多。")])]),s._v(" "),n("h3",{attrs:{id:"创建sftp用户与组"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#创建sftp用户与组"}},[s._v("#")]),s._v(" 创建SFTP用户与组")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupadd")]),s._v(" javgrp\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("usermod")]),s._v(" -G javgrp root\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("useradd")]),s._v(" -G javgrp -m -d /home/javadm -s /bin/bash javadm\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("useradd")]),s._v(" -G javgrp -m -d /home/appadm -s /bin/bash appadm\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" -p /appl/sftp-staging/jd/inbound\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" -R javadm:javgrp /appl/sftp-staging\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("750")]),s._v(" /appl/sftp-staging\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("750")]),s._v(" /appl/sftp-staging/jd\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("770")]),s._v(" /appl/sftp-staging/jd/inbound\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ln")]),s._v(" -s /appl/sftp-staging/jd /home/appadm/jd\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" -p /home/appadm/.ssh\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" appadm:javgrp /home/appadm/.ssh\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("750")]),s._v(" /home/appadm/.ssh\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("touch")]),s._v(" /home/appadm/.ssh/authorized_keys\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" appadm:javgrp /home/appadm/.ssh/authorized_keys\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("750")]),s._v(" /home/appadm/.ssh/authorized_keys\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /home/appadm/.ssh/authorized_keys\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br")])]),n("h3",{attrs:{id:"配置sshd-config"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#配置sshd-config"}},[s._v("#")]),s._v(" 配置sshd_config")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /etc/ssh/sshd_config\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("#Subsystem sftp /usr/libexec/openssh/sftp-server\n#Subsystem sftp /usr/lib/openssh/sftp-server\n#Subsystem sftp internal-sft \t # 指定使用sftp服务使用系统自带的internal-sftp\n#Match Group sftpgroup # 匹配sftp组的用户,若要匹配多个组,可用逗号分开\n#X11Forwarding no # 禁止用户使用端口转发\n#AllowTcpForwarding no # 禁止用户使用端口转发 \n#ChrootDirectory /home/sftp/%u # 限制用户的根目录\n#ForceCommand internal-sftp # 只能用于sftp登录\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("p",[s._v("sftp-server和internal-sftp都是OpenSSH的一部分。")]),s._v(" "),n("p",[s._v("sftp-server是一个独立的二进制文件。")]),s._v(" "),n("p",[s._v("internal-sftp是一个配置关键字,无需外部二进制文件额外启动一个进程,整合在sshd进程内了。")]),s._v(" "),n("p",[s._v("internal-sftp相较于 /usr/lib/openssh/sftp-server 优点在于:")]),s._v(" "),n("ol",[n("li",[s._v("性能好,无需额外进程;")]),s._v(" "),n("li",[s._v("安全性好,无需用户登录shell,且可使用ChrootDirectory 限制sftp行为活动的目录;")]),s._v(" "),n("li",[s._v("sftp-server 的存在主要是向后兼容。")])]),s._v(" "),n("h3",{attrs:{id:"连通性测试"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#连通性测试"}},[s._v("#")]),s._v(" 连通性测试")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sftp")]),s._v(" -oPort"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("22")]),s._v(" sftpusr@192.168.1.31\nput /opt/foo.txt /home/sftpusr/sftp-staging/tms/inbound\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/28.d9ec0ac4.js b/assets/js/28.d9ec0ac4.js new file mode 100644 index 00000000..3f9c445e --- /dev/null +++ b/assets/js/28.d9ec0ac4.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{630:function(s,a,t){s.exports=t.p+"assets/img/file-permissions-rwx.59eec2ed.jpg"},631:function(s,a,t){s.exports=t.p+"assets/img/rwx-standard-unix-permission-bits.12da5439.png"},736:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s.$createElement,n=s._self._c||a;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("p",[s._v("Linux有两种类型的用户:人类用户和系统用户。")]),s._v(" "),n("p",[s._v("每位用户都有一个唯一的标识号(Unique Identity,简称 UID),以及至少一个组标识号(Group Identification,简称 GID)。")]),s._v(" "),n("p",[s._v("所有用户都有一个主组,而且可以是多个组的成员。")]),s._v(" "),n("p",[s._v("每位人类用户都有一个自己的主目录,用于保存个人文件。用户主目录位于"),n("code",[s._v("/home")]),s._v(",并以所有者命名")]),s._v(" "),n("p",[s._v("用户可以属于多个组,这些额外的组称为补充组(附加组)。")]),s._v(" "),n("p",[s._v("组中的用户拥有该组的所有权限。权限可以控制文件和命令的访问,是系统安全的基础。")]),s._v(" "),n("p",[s._v("系统用户代表系统服务和进程。系统用户需要用户账号来控制它们的权限,但这些账号不能用来登录,"),n("code",[s._v("/home")]),s._v("中也没有系统用户的目录。")]),s._v(" "),n("p",[s._v("人类用户又分为两类:管理员(root,又称超级用户)和普通用户(又称非特权用户)。")]),s._v(" "),n("p",[s._v("普通用户的权限只够管理自己的文件和运行允许普通用户使用的命令。")]),s._v(" "),n("p",[s._v("普通用户也可以被赋予有限的或完整的root权限。")]),s._v(" "),n("p",[s._v("在Linux系统中,"),n("code",[s._v("/etc/passwd")]),s._v("文件包含了系统上所有用户的信息。该文件的每一行代表一个用户,行的内容遵循如下格式:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("用户名:密码占位符:用户ID:组ID:用户描述:用户主目录:登录shell\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("例如,一个"),n("code",[s._v("/etc/passwd")]),s._v("文件中的实际行可能看起来像这样:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("root:x:0:0:root:/root:/bin/bash\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("ul",[n("li",[s._v("root:表示用户名。")]),s._v(" "),n("li",[s._v("x:密码占位符。密码并不在这里显示,而是在另一个影子文件(/etc/shadow)中。")]),s._v(" "),n("li",[s._v("0:UID,用户ID号。0表示管理员,1~499表示系统用户,500~65535表示一般用户。")]),s._v(" "),n("li",[s._v("0:GID,组ID号。此处用来判断用户的初始组。")]),s._v(" "),n("li",[s._v("root:注释性描述。可以没有。")]),s._v(" "),n("li",[s._v("/root:用户的家目录。用户一登录系统所处的文件夹。一般来说,用户对自己的家目录有完全(读、写、执行)权限,其他用户对此目录的访问权限根据具体情况设置。")]),s._v(" "),n("li",[s._v("/bin/bash:登录shell。常用的有两种:/bin/bash和/sbin/nologin,前一种表示用户可以登录到系统,后一种则不能。")])]),s._v(" "),n("p",[s._v("在Linux系统中,"),n("code",[s._v("/etc/group")]),s._v("文件包含了系统上所有用户组的信息。该文件的每一行代表一个用户组,并包含了用户组的相关信息,行的内容遵循如下格式:")]),s._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("组名:x:组ID:用户列表(多个用户用逗号分隔)\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("x 是占位符,表示密码不可用,因为用户组密码存储在"),n("code",[s._v("/etc/gshadow")])]),s._v(" "),n("h2",{attrs:{id:"用户管理"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#用户管理"}},[s._v("#")]),s._v(" 用户管理")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看用户")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" /etc/passwd\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" /etc/passwd "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" username\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 打印出指定用户名的用户和组信息")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("id")]),s._v(" username\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("h3",{attrs:{id:"useradd"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#useradd"}},[s._v("#")]),s._v(" useradd")]),s._v(" "),n("p",[s._v("基本语法:useradd [options] username。")]),s._v(" "),n("p",[s._v("常用参数:")]),s._v(" "),n("ul",[n("li",[s._v("-c comment:为账户添加备注,备注文字保存在passwd的备注栏中。")]),s._v(" "),n("li",[s._v("-d home:指定用户登录时的起始目录。")]),s._v(" "),n("li",[s._v("-s shell:指定用户登录后使用的shell。默认值为/bin/bash。")]),s._v(" "),n("li",[s._v("-m:自动建立用户的登录目录。如果不加此参数,系统不会自动创建家目录。")]),s._v(" "),n("li",[s._v("-g group:指定用户所属的初始群组。")]),s._v(" "),n("li",[s._v("-G group:指定用户所属的其他附加群组。")]),s._v(" "),n("li",[s._v("-u uid:指定用户的UID号。")]),s._v(" "),n("li",[s._v("-r:创建系统账号,通常这是创建没有家目录的用户(如系统服务)时使用的选项。")])]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 创建用户账号。使用 useradd 指令创建的账号,保存在 /etc/passwd 文本文件中")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("useradd")]),s._v(" username\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -d 指定用户登入时的起始目录")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("useradd")]),s._v(" -d /home/username username\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -g 指定用户的主组。每个用户只能有一个主组。主组是用户登录系统时的默认组。创建新用户时,如果没有明确指定主组,系统会默认创建一个与用户名相同的组作为主组。用户的主组不能被删除,如果用户被删除,且其主组没有其他用户,该主组也会被自动删除。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("useradd")]),s._v(" -g groupname username\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -G 指定用户的附加组。用户可以属于多个附加组。附加组允许用户共享文件和目录。附加组可以直接被删除,无需关心是否还有其他用户属于该组。用户被删除时,其所属的附加组不会受到影响。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("useradd")]),s._v(" -G groupname username\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("h3",{attrs:{id:"userdel"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#userdel"}},[s._v("#")]),s._v(" userdel")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -r 删除用户登入目录以及目录中所有文件")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("userdel")]),s._v(" -r username\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("h3",{attrs:{id:"usermod"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#usermod"}},[s._v("#")]),s._v(" usermod")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -l 修改用户账号名称")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("usermod")]),s._v(" -l new_username old_username\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -L 锁定用户密码,使密码无效")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("usermod")]),s._v(" -L username\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -d 修改用户登入时的起始目录")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("usermod")]),s._v(" -d /home/username username\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -g 修改用户的主组")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("usermod")]),s._v(" -g groupname username\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -G 修改用户的附加组")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("usermod")]),s._v(" -G groupname username\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -a 将用户添加到补充组。仅与-G选项一起使用。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("usermod")]),s._v(" -a -G groupname username\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br")])]),n("h3",{attrs:{id:"passwd"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#passwd"}},[s._v("#")]),s._v(" passwd")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 修改当前用户密码")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("passwd")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 设置指定用户密码")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("passwd")]),s._v(" username\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 锁定用户,用户不能登录")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("passwd")]),s._v(" -l username\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解锁用户")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("passwd")]),s._v(" -u username\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除用户密码")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("passwd")]),s._v(" -d username\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br")])]),n("h2",{attrs:{id:"组管理"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#组管理"}},[s._v("#")]),s._v(" 组管理")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看用户组")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" /etc/group\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" /etc/group "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" groupname\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("h3",{attrs:{id:"groupadd"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#groupadd"}},[s._v("#")]),s._v(" groupadd")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 创建用户组。使用 groupadd 指令创建的组,保存在 /etc/group 文本文件中")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupadd")]),s._v(" groupname\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("h3",{attrs:{id:"groupdel"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#groupdel"}},[s._v("#")]),s._v(" groupdel")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除用户组")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupdel")]),s._v(" groupname\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("h3",{attrs:{id:"groupmod"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#groupmod"}},[s._v("#")]),s._v(" groupmod")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重命名用户组")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupmod")]),s._v(" -n new_groupname old_groupname\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("h2",{attrs:{id:"权限控制"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#权限控制"}},[s._v("#")]),s._v(" 权限控制")]),s._v(" "),n("h3",{attrs:{id:"chown"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#chown"}},[s._v("#")]),s._v(" chown")]),s._v(" "),n("p",[s._v("Linux chown(英文全拼:"),n("strong",[s._v("change owner")]),s._v(")命令用于设置文件所有者和文件关联组的命令。")]),s._v(" "),n("p",[s._v("语法:")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" 用户名:组名 文件名 "),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -R 表示递归")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("chown 需要超级用户 root 的权限才能执行此命令。")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 把 /var/run/httpd.pid 的所有者设置 root")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" root /var/run/httpd.pid\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将文件 file1.txt 的拥有者设为 runoob,群体的使用者 runoobgroup")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" runoob:runoobgroup file1.txt\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("h3",{attrs:{id:"chmod"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#chmod"}},[s._v("#")]),s._v(" chmod")]),s._v(" "),n("p",[s._v("chmod, change mode的缩写,即更改模式。")]),s._v(" "),n("p",[s._v("权限的符号表示及八进制表示")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("模式")]),s._v(" "),n("th",[s._v("符号表示")]),s._v(" "),n("th",[s._v("八进制表示")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("读取(read)")]),s._v(" "),n("td",[s._v("r")]),s._v(" "),n("td",[s._v("4")])]),s._v(" "),n("tr",[n("td",[s._v("写入(write)")]),s._v(" "),n("td",[s._v("w")]),s._v(" "),n("td",[s._v("2")])]),s._v(" "),n("tr",[n("td",[s._v("执行(execute)")]),s._v(" "),n("td",[s._v("x")]),s._v(" "),n("td",[s._v("1")])]),s._v(" "),n("tr",[n("td",[s._v("没有权限")]),s._v(" "),n("td",[s._v("-")]),s._v(" "),n("td",[s._v("0")])])])]),s._v(" "),n("p",[s._v("权限实际意义与操作命令:")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th"),s._v(" "),n("th",[s._v("文件")]),s._v(" "),n("th",[s._v("文件夹")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("r")]),s._v(" "),n("td",[s._v("查看内容,如:cat/more/less/head/tail")]),s._v(" "),n("td",[s._v("列出文件夹内容,如:ls")])]),s._v(" "),n("tr",[n("td",[s._v("w")]),s._v(" "),n("td",[s._v("追加或修改内容,如:echo/vi")]),s._v(" "),n("td",[s._v("对文件夹内的文件个数做新增或减少,如:mkdir/touch/rm/cp/mv")])]),s._v(" "),n("tr",[n("td",[s._v("x")]),s._v(" "),n("td",[s._v("编译执行")]),s._v(" "),n("td",[s._v("进入文件夹,如:cd")])])])]),s._v(" "),n("p",[s._v("所有者的符号表示")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("模式")]),s._v(" "),n("th",[s._v("表示")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("u")]),s._v(" "),n("td",[s._v("用户(user)")])]),s._v(" "),n("tr",[n("td",[s._v("g")]),s._v(" "),n("td",[s._v("组(group)")])]),s._v(" "),n("tr",[n("td",[s._v("o")]),s._v(" "),n("td",[s._v("其他人(other)")])]),s._v(" "),n("tr",[n("td",[s._v("a")]),s._v(" "),n("td",[s._v("所有人(all)")])])])]),s._v(" "),n("p",[s._v("运算符表示")]),s._v(" "),n("table",[n("thead",[n("tr",[n("th",[s._v("运算符")]),s._v(" "),n("th",[s._v("表示")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("+")]),s._v(" "),n("td",[s._v("添加权限")])]),s._v(" "),n("tr",[n("td",[s._v("-")]),s._v(" "),n("td",[s._v("删除现有权限")])]),s._v(" "),n("tr",[n("td",[s._v("=")]),s._v(" "),n("td",[s._v("添加新权限,并删除任何未指定的权限位")])])])]),s._v(" "),n("p",[n("img",{attrs:{src:t(630),alt:""}})]),s._v(" "),n("p",[n("img",{attrs:{src:t(631),alt:""}})]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("ugo"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("+-"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("rwx"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" 文件或目录\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# r=4 w=2 x=1")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("777")]),s._v(" 文件或目录\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 修改文件拥有者,只有root有权限")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("选项"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" 用户或组 文件\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将文件 file1.txt 设为所有人皆可读取")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" ugo+r file1.txt\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" a+r file1.txt\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("222")]),s._v(" file1.txt\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将文件 file1.txt,file2.txt 设为所有者及所属组可写,其他人不可写")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" ug+w,o-w file1.txt file2.txt\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("440")]),s._v(" file1.txt file2.txt\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 为 ex1.py 文件拥有者增加可执行权限")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" u+x ex1.py\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("100")]),s._v(" ex1.py\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br")])]),n("h3",{attrs:{id:"su-sudo"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#su-sudo"}},[s._v("#")]),s._v(" su/sudo")]),s._v(" "),n("p",[s._v("Linux su(英文全拼:switch user)命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。")]),s._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 切换用户的同时切换目标用户的工作环境")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("su")]),s._v(" - username\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("p",[s._v("Linux sudo命令以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。")]),s._v(" "),n("p",[s._v("使用权限:在 /etc/sudoers 中有出现的使用者。")]),s._v(" "),n("h3",{attrs:{id:"login-logout"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#login-logout"}},[s._v("#")]),s._v(" login/logout")]),s._v(" "),n("p",[s._v("Linux logout命令用于退出系统。")]),s._v(" "),n("p",[s._v("logout指令让用户退出系统,其功能和login指令相互对应。")])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/29.737ec816.js b/assets/js/29.737ec816.js new file mode 100644 index 00000000..d13e4242 --- /dev/null +++ b/assets/js/29.737ec816.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{652:function(t,s,n){t.exports=n.p+"assets/img/20240129222804.76035e79.png"},653:function(t,s,n){t.exports=n.p+"assets/img/20240129222922.6abddee6.png"},747:function(t,s,n){"use strict";n.r(s);var a=n(7),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[a("a",{attrs:{href:"https://www.python.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.python.org/"),a("OutboundLink")],1)]),t._v(" "),a("p",[a("a",{attrs:{href:"https://docs.python.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://docs.python.org/"),a("OutboundLink")],1)]),t._v(" "),a("p",[a("a",{attrs:{href:"https://docs.python.org/3.12/library/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://docs.python.org/3.12/library/index.html"),a("OutboundLink")],1)]),t._v(" "),a("p",[a("a",{attrs:{href:"https://www.cainiaojc.com/python/python-tutorial.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.cainiaojc.com/python/python-tutorial.html"),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("检查是否安装Python")]),t._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("python --version\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[t._v("为不同平台上安装 Python 的方法访问"),a("a",{attrs:{href:"https://www.runoob.com/python/python-install.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.runoob.com/python/python-install.html"),a("OutboundLink")],1)]),t._v(" "),a("p",[t._v("以下为在 Unix & Linux 平台上安装 Python 的简单步骤:")]),t._v(" "),a("ul",[a("li",[t._v("打开 WEB 浏览器访问"),a("a",{attrs:{href:"https://www.python.org/downloads/source/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.python.org/downloads/source/"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("选择适用 于Unix/Linux 的源码压缩包。")]),t._v(" "),a("li",[t._v("下载及解压压缩包。")]),t._v(" "),a("li",[t._v("如果你需要自定义一些选项修改"),a("em",[t._v("Modules/Setup")])]),t._v(" "),a("li",[t._v("执行 ./configure 脚本")]),t._v(" "),a("li",[t._v("make")]),t._v(" "),a("li",[t._v("make install")]),t._v(" "),a("li",[t._v("在 bash shell (Linux): 输入"),a("code",[t._v('export PATH="$PATH:/usr/local/bin/python"')]),t._v(",按下 Enter设置环境变量")])]),t._v(" "),a("p",[t._v("执行以上操作后,Python 会安装在 /usr/local/bin 目录中,Python 库安装在 /usr/local/lib/pythonXX,XX 为你使用的 Python 的版本号。")]),t._v(" "),a("p",[t._v("安装Python时,pip通常会被同时安装。pip, Package Installer for Python,Python包管理器。")]),t._v(" "),a("p",[t._v("检查是否安装pip")]),t._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("pip --version\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[t._v("安装python-pip及python-devel程序包")]),t._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("yum -y "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" python-pip\nyum -y "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" python-devel\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br")])]),a("p",[t._v("升级pip,解决“WARNING: There was an error checking the latest version of pip.”")]),t._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("python -m pip "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -U --force-reinstall pip\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[t._v("使用pip命令安装、升级或卸载Python库")]),t._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("pip "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" 库名\npip "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" 库名"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v("版本 \t\t "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 指定版本安装")]),t._v("\npip "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" --upgrade 库名 \t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 升级已安装的库")]),t._v("\npip "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -U 库名 \t\t\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 升级已安装的库")]),t._v("\npip uninstall 库名 \t\t\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 卸载已安装的库")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br")])]),a("h2",{attrs:{id:"在idea中配置python环境"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#在idea中配置python环境"}},[t._v("#")]),t._v(" 在IDEA中配置Python环境")]),t._v(" "),a("p",[t._v("File -> Project Structure -> SDKs -> Add Python SDK...")]),t._v(" "),a("p",[a("img",{attrs:{src:n(652),alt:""}})]),t._v(" "),a("p",[a("img",{attrs:{src:n(653),alt:""}})]),t._v(" "),a("h2",{attrs:{id:"pip生成requirement配置文件-快速安装配置环境"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#pip生成requirement配置文件-快速安装配置环境"}},[t._v("#")]),t._v(" pip生成requirement配置文件,快速安装配置环境")]),t._v(" "),a("p",[t._v("在当前目录下生成requirements.txt文件")]),t._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("pip freeze "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" ./requirements.txt\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[t._v("根据requirements.txt文件安装配置环境")]),t._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("pip "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -r ./requirements.txt\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("h2",{attrs:{id:"模块的理解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#模块的理解"}},[t._v("#")]),t._v(" 模块的理解")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://docs.python.org/3/tutorial/modules.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("module"),a("OutboundLink")],1),t._v("是Python中的一个重要概念。")]),t._v(" "),a("p",[a("strong",[t._v("module")]),t._v("将一组相关功能封装在一个"),a("strong",[t._v("文件")]),t._v("中,从而实现代码的复用和模块化开发。")]),t._v(" "),a("p",[t._v("Python内置很多module,例如math、datetime、os等,同时也支持用户自定义module。")]),t._v(" "),a("p",[t._v("module的导入方式:")]),t._v(" "),a("div",{staticClass:"language-python line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" math\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("math"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sqrt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" math "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" sqrt\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sqrt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" math "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sqrt"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br")])]),a("h2",{attrs:{id:"包的理解"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#包的理解"}},[t._v("#")]),t._v(" 包的理解")]),t._v(" "),a("p",[t._v("将相似的模块放在同一个目录中,目录必须包含一个名为 _"),a("em",[t._v("init")]),t._v("_.py 的文件,该目录被Python视为一个"),a("a",{attrs:{href:"https://docs.python.org/3/tutorial/modules.html#packages",target:"_blank",rel:"noopener noreferrer"}},[t._v("包"),a("OutboundLink")],1),t._v("。")]),t._v(" "),a("h2",{attrs:{id:"数据类型"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#数据类型"}},[t._v("#")]),t._v(" 数据类型")]),t._v(" "),a("p",[t._v("使用 type() 函数来判断一个变量或值属于哪个类。")]),t._v(" "),a("p",[t._v("使用 isinstance() 函数用于检查对象是否属于特定的类。")]),t._v(" "),a("p",[t._v("数字(Number):整数、浮点数和复数")]),t._v(" "),a("p",[t._v("字符串(String):使用单引号或双引号来表示字符串。使用三引号 ''' 或 \"\"\" 来表示多行字符串。")]),t._v(" "),a("p",[t._v("列表(List):是项目的有序序列。用逗号分隔的项目放在方括号内[ ]。列表中的项目允许不是同一类型。")]),t._v(" "),a("p",[t._v("元组(Tuple):是项目的有序序列。用逗号分隔的项目放在括号内()。元组中的项目允许不是同一类型。元组是不可变的。元组一旦创建就不能修改。")]),t._v(" "),a("p",[t._v("集合(Set):是无序集合,索引没有意义,切片运算符 [] 不起作用。用逗号分隔的项目放在大括号内{}。可以在两个集合上执行集合操作,例如:并集,交集等。")]),t._v(" "),a("p",[t._v("字典(Dictionary):键值对的无序集合。使用大括号 {} 定义字典,每一项都是形式为 key:value 。键 和 值 可以是任何类型。")]),t._v(" "),a("h2",{attrs:{id:"下划线的用法"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#下划线的用法"}},[t._v("#")]),t._v(" 下划线的用法")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("模式")]),t._v(" "),a("th",[t._v("举例")]),t._v(" "),a("th",[t._v("说明")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("单前导下划线")]),t._v(" "),a("td",[t._v("_var")]),t._v(" "),a("td",[t._v("命名约定,私有的,仅供内部使用,通常不会由Python解释器强制执行。")])]),t._v(" "),a("tr",[a("td",[t._v("单末尾下划线")]),t._v(" "),a("td",[t._v("var_")]),t._v(" "),a("td",[t._v("规避重名,按约定使用以避免与Python关键字的命名冲突")])]),t._v(" "),a("tr",[a("td",[t._v("双前导下划线")]),t._v(" "),a("td",[t._v("__var")]),t._v(" "),a("td",[t._v("在类上下文中使用,防止变量在子类中被重写,触发”名称修饰“,由Python解释器强制执行")])]),t._v(" "),a("tr",[a("td",[t._v("双前导和末尾下划线")]),t._v(" "),a("td",[t._v("__var__")]),t._v(" "),a("td",[t._v("若是变量,则该变量不会被Python解释器修改。"),a("br"),t._v("若是函数,则该函数是Python的“特殊函数”或”魔术方法/魔法函数“。"),a("br"),t._v("例如:"),a("br"),t._v("_"),a("em",[t._v("init")]),t._v("_()函数在面向对象编程(OOP)中称为构造函数,每当实例化该类的新对象时,都会调用此特殊函数,通常使用它来初始化所有变量。")])]),t._v(" "),a("tr",[a("td",[t._v("单下划线")]),t._v(" "),a("td",[t._v("_")]),t._v(" "),a("td",[t._v("有时用作临时或无意义变量的名称")])])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/30.44a83b36.js b/assets/js/30.44a83b36.js new file mode 100644 index 00000000..3de25fdb --- /dev/null +++ b/assets/js/30.44a83b36.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{660:function(t,e,r){t.exports=r.p+"assets/img/20210303163430.9e59e181.png"},661:function(t,e,r){t.exports=r.p+"assets/img/20210304233755.e88997c8.png"},755:function(t,e,r){"use strict";r.r(e);var _=r(7),v=Object(_.a)({},(function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h2",{attrs:{id:"缓存流程"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#缓存流程"}},[t._v("#")]),t._v(" 缓存流程")]),t._v(" "),_("img",{attrs:{src:r(660)}}),t._v(" "),_("h2",{attrs:{id:"缓存穿透"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#缓存穿透"}},[t._v("#")]),t._v(" 缓存穿透")]),t._v(" "),_("p",[t._v("缓存穿透是指缓存和数据库中都没有数据,而用户不断地发起请求。")]),t._v(" "),_("p",[t._v("解决方案:")]),t._v(" "),_("ol",[_("li",[t._v("校验参数、用户身份;")]),t._v(" "),_("li",[t._v("不存在的数据设置空缓存;(浪费内存)")]),t._v(" "),_("li",[t._v("布隆算法(布隆过滤器)")])]),t._v(" "),_("blockquote",[_("p",[t._v("哈希函数:将任意大小的数据转换成特定大小的数据的函数,转换后的数据称为哈希值或哈希编码。原始数据经过哈希函数的映射后称为了一个个的哈希编码,数据得到压缩。")]),t._v(" "),_("p",[t._v("哈希函数是实现哈希表和布隆过滤器的基础。")]),t._v(" "),_("img",{attrs:{src:r(661)}})]),t._v(" "),_("h2",{attrs:{id:"缓存击穿"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#缓存击穿"}},[t._v("#")]),t._v(" 缓存击穿")]),t._v(" "),_("p",[t._v("缓存击穿是指缓存中没有但是数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读取缓存没读到数据,又同时去查数据库,造成数据库压力过大。缓存击穿是并发查询同一条数据。")]),t._v(" "),_("p",[t._v("解决方案:")]),t._v(" "),_("ol",[_("li",[t._v("设置热点数据永不过期;")]),t._v(" "),_("li",[t._v("定时任务刷新缓存时间;")]),t._v(" "),_("li",[t._v("加互斥锁/分布式锁,访问数据库。")])]),t._v(" "),_("h2",{attrs:{id:"缓存雪崩"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#缓存雪崩"}},[t._v("#")]),t._v(" 缓存雪崩")]),t._v(" "),_("p",[t._v("缓存雪崩是指缓存中不同的数据在某一时刻突然失效,导致大量的请求打到数据库中。")]),t._v(" "),_("p",[t._v("引起原因:")]),t._v(" "),_("ol",[_("li",[t._v("缓存数据的有效期一致;")]),t._v(" "),_("li",[t._v("Redis挂了;")])]),t._v(" "),_("p",[t._v("解决方案:")]),t._v(" "),_("ol",[_("li",[t._v("设置热点数据永不过期;")]),t._v(" "),_("li",[t._v("缓存数据的有效期随机,防止同一时间大量数据过期现象发生;(缓存数据的有效期一致)")]),t._v(" "),_("li",[t._v("定时任务刷新缓存时间;")]),t._v(" "),_("li",[t._v("加互斥锁/分布式锁,访问数据库;")]),t._v(" "),_("li",[t._v("Redis集群:切片集群模式(分布式,每个节点存部分数据)、副本集群模式(即主从/主备)。(Redis挂了)")])]),t._v(" "),_("h2",{attrs:{id:"参考资料"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#参考资料"}},[t._v("#")]),t._v(" 参考资料")]),t._v(" "),_("p",[_("a",{attrs:{href:"https://blog.csdn.net/kongtiao5/article/details/82771694",target:"_blank",rel:"noopener noreferrer"}},[t._v("缓存穿透、缓存击穿、缓存雪崩区别和解决方案"),_("OutboundLink")],1)]),t._v(" "),_("p",[_("a",{attrs:{href:"https://www.bilibili.com/video/BV1ii4y1t7oP",target:"_blank",rel:"noopener noreferrer"}},[t._v("Redis缓存穿透的终极解决方案,手写布隆过滤器"),_("OutboundLink")],1)]),t._v(" "),_("p",[_("a",{attrs:{href:"https://www.cnblogs.com/cpselvis/p/6265825.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("布隆过滤器(Bloom Filter)的原理和实现"),_("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=v.exports}}]); \ No newline at end of file diff --git a/assets/js/31.c04d4973.js b/assets/js/31.c04d4973.js new file mode 100644 index 00000000..57e5fae6 --- /dev/null +++ b/assets/js/31.c04d4973.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{666:function(A,t){A.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQgAAADOCAYAAADCMJziAAAJ8UlEQVR4nO3di46juBaF4ZOjef9XrpkoQkURb/B13/x/Uqu7U5WEGLMwYHZeP//5HwAU/N96AQD4RUAAEBEQAEQEBMy8Xi/rRcCD4YBgJaPHu9+8z4/Tf3xjBAF1Rzi8ERK+/XN94LyyNK6AnjvL6ve5Wvm+2u0YRWl9HyFR205afQaXgLg2/OoVobXnKH2Ole+t3Y5R3B1W1IYEow1dfw4xtDux1vuVwmHle3sJg/fnvG5QNY/1Pu9pOc6HFdK/n17TS9vu4usQA3MxemjbqHdvK28IiIWsh8Olja3msd7n3ZHaQvvcENqIAZF1z6f5uY73ydqWLUqfn3bxj8ucUFUaMViPtCArBgTJjhWkflVzchI2vgLivBKzrTCCz85Tv8ra56J7netB9JwwYoWukyXMpHkoPeclmICm609AAMAZJykBiAgIACICAoCIgAAgIiAAiAgIACICAiaYPxPDsoCgA0BCPco4GEFAFfUoY6muBxF9iqvF8h/vGbG9VhitRxm9D0ZUFRDRayxaLH+0NlpttB5l9D4YVVVAsCLaeOi8pdFLzWO9z6tdDqmIzjk8rNsOv7YoOXfeQ2lU6qaz/6IeZWxbBMSbRjgcrrUPLDo+9SgxQ3NAeBg+99AaQbxFbJ+VqEcZ1xaXObm05kPGepSelr+lfWuXuykgSH30oh7leqW2LO0QW7bj6oDIXKsSa1GPUs/1StPRpse/r/9/UlVyrrdWpafRhuYkGyb0/Mpcj9Lb8jzp2SaX1KRkT9AvQkfDR4SAkK6o1YbFksucXhsLyGxFYG1xFQOYrXTiz9r5m9Jn2WaiFLCrc3i1BhkjCCC588iidZTBCALoEOU8293NcTUYQQADPJx7WImAABIp1d0YmZPEIQbUeZtEl8XdPUfSSOdpPagHBJ1jb5p31e6m5tb9VsOHGNc53p5pLGOk9tA2elctbapvaAQRqU6gVjhEaQ9tMwvWQs9QQETp/FrfwxClPbSNFqw9/x50cZJyEevRQ0/xWQrW4ip9QFhsqOzpPihYG9+0gLDeY5ZYF4y1bJOe4rMUrMXVFiOI6//piHooWBvblJmUXlf4cWPK9WYV6MtYsHYHU+ZBUFMQdyhYG9dQQLQWwMzuPEnK66hK26yCtee+Bj1bzIM48IU5uqTLmdKEqTu0rQ2Tk5TsBepE3yharoBE/6xZqQcEHQGIg3oQAEQEBAARAQFAREAAEBEQAEQEBNRxmTsONwFBp9mDVvEezLE0ILzUZ9ReDuvP6xU1Ke30tt2yiVJe6jNqLweduIyalDru2qmnBseygPAyY1J7ORg+f6Mmpa6ZfT59wZhdUZNyb7NufiMgsAw1Ke1I7dl6iK0SEF5qI3hZDg3UpMRh5NvMGEFgKWpS2ijVYi09bv7dnF46g5fl2FWp/Vkn69S0dc1J3+XzIDzUq/SyHLuiJqU/teG8LCC81KvUXg5qJ/5FTUqfzK9ieBk6WsyDwAc1KXWtOGRzdZKSvcNf0TcKalLaGw0NNwFBBwHG3J3n6d2+3NzNCWCNkZ0vAQFAREAAEBEQAEQEBAARAQF1XM6OI0RA0KHyoCZlLCECAjmM1qSEPrOJUufOoTFJSuvOQe3PFcXMmpS0qx6TgMhaSNZLoV5vRmtS0q52TAKCQrLrUZMSM7i5FwP5UJMyPgIiKWpSYgbzgOB4MjdqUsbGZU6oKI0YdjsvFJFpQLAn2QM1KeMyCwgKye5hVk1K2DCbB3H+W/P9Vo5YrpdTdx8dzapJSbvaef0EaO1d9y4BVs32sh8mm1/FqJF5BQCecRUDgIiAAJK5u6TcerhOQAAQhTgHAaBdzTR382/3BqDjvOFf747tvUzMIQbU7XrZerX3hn++tX7G1b/wAUFni4WalHpmtHH4gEAc1KTUcw7iazu33P/i7hxE9Cm114aP+BlWGK1JKb0GfpW2ndFzEK4CIkvtwYjLvNJoTcrjNXBvxY1vrgIi+oblKdCy1aTkkMSGq4DIgOKrv6hJaYt5EM54OjyiJuV+SiOz889Kjz9xGxDWG9io1hNwWVGTUs+KPsdlTqigJqWOu3M4dz+XuAwI9jC5UJMyLncBkaVWJSH3QU3K2Fydg9CuVTlb9Eles82qSXm8Vuk1sVaImpSSqEFSI/Bq2Ur2wHI1gmiVecUAHrg7BwHADwICgIiAACAiIACICAgAIgIC6jJfns4mdUDQEf2hJmUsqQMCvlCTMp5QE6UiTGWOsIwWRmtS0q42wgREhHqVEZbRwmhNStrVTpiAiNAhPC1jtpqUsBEmIBAPNSnjIyCSoiYlZggZEBGOQSMsowZqUsbGZU6ooCZlTOFGEBH2PhGWUdNTTcrj3xjzFLg9V4JCjSAi1KuMsIyaqEmp592W5ytG1z89bRxmBBGhXmWEZdQ0qybl9eeMNvSECYjeTmG9sfa+f4aNoOUKyNPnzdAemmZ9y3yYgOhBp8JuSiO0kZ1kqHMQAHQREEASpXteRq+oERBAEitupScggIRmfdM3AQFAREAACUnzTVoREFBnPTclu5lT/bcNCDqpDYrWrvNu05rqXC0BkiYgjg/uoeN5WAaPRovW0q73zvdijPzOWYqAODreyE0pM5cF33ruwbg+H/pSTLX2NKXaOqA8Gi1ae/496EoREPhG0VrMQEBgGYrWxpcuIKjm9EHRWsyQLiDgC0VrY0txFeNAx/Mra9Ha7P0tTUBQC9Kvp6K1rC+/UgTEuRakdWejLuVfs4rW0q42Xj/Zx0gCDkfWk8qfcV4ijq0DwrtNVw0c2fYqBhsf8CzFOQgAaxAQAEQEBAARAQFAREAAEBEQAEQEBADRtvMgVuKr6pEFATHZdcowU4gRGYcYAEQEBAARAQFAREAAEBEQAEQEBAARAQFAxDyIya5fEcccCERGQCxAKCALDjEAiAgIACICAoCIgAAgIiAAiAgIACICAoCIgAAgegwID9+YDcCG6gjiGjSl4DkC6fxH+vnd62iQll/63buwfWqL2ufMfD12DHicaj1r2nCpVuPT71x/T6r3eNz/0LOsLRvBU63Juw3v7rk1bVHznNmvN9KuyEHlXoxSJ7ve1HQ8dve8u47a25l7Q6X0vNJnql2G1ufdPWfm6xESe1t+iLGqc1l1WjYW7CTk3ZxPe86WDbj3EGMnjCL25TYg7jrk8fiMTkunB2RfhxhPlzWjXPa8uwKCMbTjPtJOlJJOePaeSMQH7biXr0OMpyG3xpCc412/WC97WX4OQjrBdex9WsKg9bLoCncn7KTP9FSnsvS8nuesfD2CYU9mJymf5jS0PseDns909zMvr1dCaOxB5RyExvGqZofd6fj7bkSxSxvs7PWjuBvQnDRVGk4fj62aPp5NzXTyzJ8fygEBIJa0lzkBjCMgAIgICAAiAgKA6F8vqn2WTo1OggAAAABJRU5ErkJggg=="},667:function(A,t){A.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARoAAADyCAYAAACS0wrhAAANPUlEQVR4nO3dC3OrNhCG4brT//+XT8tJaRVld7W6LOjyPjOZxMaAg+GzJIT4/PrHHwAQ6M+33wCA/RE0AMIRNADC/fX2G7B8Pp///raakkqvu6Zrz2vzpdNK6wdgmzZo8nCwwsJ6XR4YNcsnXIAxtq86aWFRKiERMsA4ywfNFQh3qWVkQFzL0kpDAOpMW3WqcYfNqJDxVNkA+C1forncYdBaArHCpGe5AL4sHzRpSBAKwJyWD5peVI2AeEcHTRoy3tPgAOp9Zr6oUutQZ/WVsTrelfrXSKEz8eYBljF10ADYw9FVJwDPIGgAhCNoAIQjaACEI2gAhCNoAITrCppSd/+VLwe4r95e+X8AZtEVNNa1RSv3qL3f+/1D2AB9uqtO0oG4cshcVn7vwIyGtNFEDT4FYA/DGoNHDz4FYB/DgqZ38KlZEZ5AvyFBw+BTACzdQaPdpmSHsKE0A4zR3Y9m17F2PYNiAfBhPBqBNSgWgHpb3G5lNEIFGKspaE6tShBAQJumoOGAA1CDq7cBhCNoAIQjaACEI2gAhCNoAIQjaA6VjiCY/9Qso/Y56e9Tu0uchA57h5KG9bCuwNcux5BuH5y/xloXzrBc0NTsoPcO33Kf7pr5dlNz/3LvY+nCW2me0Qi0OSwVNLXFeumAKX2rSjvlzt/GLdUWrSqkDX5mlYK09zBi+1Ilm8dSbTQ1JRnptdb8O4VHjXQQ9lseJNa21EoseWkmnZ4+ztefv7bHiZ/nrJYKGo+0naH2G23k7VWkZXmee3q+VlpDrlWqydtwVh9KBH7bBc0lvV2Kd0c+9fYq0tmm0jawqptSg3IePKdtYyzWRuPlKTJ7Bu3qKXp7q26eNqKn5vO0t9yvS6fnv9P503VYjcPWurT/BevYMmjQTwqPfLr1+yaVbtJpOMORQXNqw6+kpQrjOTOXv146c6dNK60L69myjcbiGQv4hCBKD3TprJPnrhZaQ7PU4JwuJ/8MSuugPWd9S40ZXNNxTHtdTgodq6qgTd+B1R7iOZNU2i5Wm421Du09lZzwma1iqaBBrJqwaCGd3taWz265F4IGQLjj2mgAPI+gARCOoAEQjqABEI6gARCOoAEQjqABEI6gARCOoAEQjqABEG7LYSKk62WsC+ykK4098wHw2S5ouPsBMJ+tqk7c/QCY0zZBM8vdDwD8tFXVqXYgpgtVIyDeNiWay6i7HwAYa6ugATCnKYMmqs2EqhF2sVrJe8qgicDdD4D3TNkY3HKw5+0rUqc7KWCsDnnWMgH4MTg5sKDVSt9TlmgAPE/rCW+1B3nDjqAB8E0eOCP6mh3TGAygT091jRINAFNadbJGOrAQNACKSvejL6HqBMCttaMgQQMgHEEDINyQoCkVp1a7LgPAWEOCxurUs1oPxtx9gSdhidP1HMvDqk5S2OwQMtf7v38IG5xIG8y/5tge2kaTHoyrh8xl9fcPtCgN1N/ypTu8Mfh+ExykwFq0Y1a7a8ir/Wg8F2IBmF9agrGmewwNmt7i1cwopQHthgXNiOIVgD0N60ez850FKM0AfYb1o+mZPjPPWMMAbFy9bbDGGgbgR9AYVi6JATPhokoA4QgaAOEIGgDhCBoA4QgaAOEIGgDhCBoA4Qiaw6UjCOY/NcuofU76m46R+6LD3uGk8YOsoT60yzHSx9prrHVhbr2f07JB4/nHpZ1fmpZP9863+wHi/d9L4ZEPHyKtIzpwCDQfq1RpffGULBk0niK255uzNGRh/njnb+OWaotWFdJGWbRKQdp7GLF9qZLVidinlwwaz9AT1sbaKSBGkUp0Vsim86VVLSlc8tJMPrh1dIDvMFTJ03qOL8mSQTNCy0juo9bjea5lvtZ19dAackvBczc4p3eYIPznUTN+sMeRZ524hcpP0tmm0vaxqqJSg3K+k7L91zDiziZHlGg8IwBGfZtq1Y3Scy3zta4rf87T3nK/Tqo6aWNHS1Ulq6qVP6+9d4yntZ9ZJ1EsRwQN2lntL/d06/dNKt2k0zAXzxdATWl0+6Ch7u/TUoXxnLXLXy81/GrTSuvCe2qPq63baDzj/Z4eROmBfv+k06QqkLaM9LHWwzhdjnRWy1oH7TnzOOKsk9Y4JQWLtHNaxfZ8Z7caL3cIqJqzC972LM920U6dR7SZjWjMPEHk9vn8Yssj49nhekoX1in8fPnsnrKIUCh1R+hZH0EDLOjJ0tmIdW3dRgOg34hAI2gAhCNoAIQjaACEI2gAhCNoAIQjaACEI2gAhFvyEoTRrMsKWi+LB/C/44PGM4wk4QL0Ob7qZIUIF+EBYxwfNCUMTwD0O77qZIkcmR84CSWahGd0OAD1CBoA31iDxbV+2RI0/6JqBMTZqo2mdVQ2bVhJ7TXACTxjRHO7FafWsYWB3Ui3w5EG9285FrYKmpYNYM1DuOAkpVJ9D9poAIhGnmXdqkQDYAzrPlstbaEEDYDfpHaYUW00VJ0A/JbfqXQkggZAOKpOAET0owEwXH5aO7+oWHrei6oTgN9G3GNbQ9AA+I81eoE1veTVoCl1CGJYBmAPrwaNNcbLLBcx3iPsEXpAu9erTlLYzBQyd98CBr4C2r0eNJf0IJ4lZC6zvA9gdVMEzSWyxRvAu6YJGusiLgBrmyJo0pLMrGFDaQto93rQaHeGnDFsALR5vR/NCrc3oTQD9Hm9H03P9CfkA5cDqMdFlYbee9kA+PL5FVRs4OD0m6HkhvlZx9Ts+1BYiWb2fxxYzUztlrVeP+sEYH8EDbC4FWoPBA2wkBVCRULQAAhH0AALW6WEQ9BAlQ76lf945/c8lz8v/b3q2RZ8ocMeVNLQHdZV9togZun0/Ln7eWtd+G7F09wEDZrkASDdj7kUHNbtPdLHBI5s9DYphVfPl8CxQSN9q0rT2MHrqy1aNcga3MwqCWnvofez4XP+rhTsPYF/bNBcPBuTb1M5hPOLTbWhPrRw0Uozecko6vNY/XNe6b1ejmwMnmWnkhpWPc+1zNe6rlZaI26pVCMFzmrtETtoafy3HBk0F26h4iftcFYAaG0t97I8d74gYN6R3/lj1BfykVWnWYrM0no9z7XM17qu/DlPm0teZZKqUGmQpDt0/hppuTmpIRpzOTJoUtx9oV2pDcb6fZNOedNI+w7p8xx1bBwfNCirrcK0nLHQ+tFo00rrQ728tDlyux7bRoOyvGqjVTm19hStoVlrH0uXI32rWr2Kac8Za3TYHF+iodqk07ZL6XR27fKs5UuBxue1nrChPGeiFckvpc5jB2yeKqUDvaVkkTcMp8uJbPzlc9Z5PueabXZE0ADw84QIlyAAaOIpKbaWJinRAAjHWScA4QgaAOEIGgDhCBoA4QgaAOEIGgDhCBoA4cKDptQlfYaL4UaOJAbgp/CgKV11+3Z/wXxEMcIGGO+RqpNn6Ma3zPAegN091kajjTUCYH+PNgYznghwpkeDpjRS2tsIQSDGY0HjGfoRwJ4eCRpr6MdZUJoB4jzSj8YavX6GsJHukAhgnOMHvtJG4wcwzvFDeRIqQLyuoNm5mkEAAeN0BQ0HIwAPrt4GEI6gARCOoAEQjqABEI6gARCOoIEqHXkw/6lZRu1z0t87d6U4wfEd9qCThvWwrsDXLuNIH2uvsdaF9R0VNN4dVzow8F2+XbRtVgqP/Kp+aR2RgUOYPeOYoPEWvflW/aml2qJVhbTBz6xSkPYeej8XqmPPOaaN5vSw6JEO3n7Lg0TavnlJRQqXdFo6PX2crz9/bc//hWccEzQzkhpWPc+1zNe6rh5aQ65VqsnbcGYZSgR9CBoUSWebSgGgtbfcy8vnz4OHgNnLMW00M7KqG9ZzLfO1rit/ztPecr8unZ7/TudP12E1Dlvr0t475kDQoJkUHvl06/dNKt2k07A+ggZFLVUYq5SjvV4646dNK60Lc6GNBqr0QJfOOnnuaqE1NkuNztpNBku36RnZgI0Yx5RopB1Yepzv0Cd/W2r/u3VXi9L28naY1NpsRvZr0vYJjHf84OSo4zkoe0oX0ultbfnsuusgaACEo40GQDiCBkA4ggZAOIIGQDiCBkA4ggZAuEeDZqXemyu919tK73ml94p+xaAZ1b17td6Xqw1TwPbFzKa4BMHb5b/0utJVxNJ80vU2O6m9nKI07EPt8lcLQMQoBs2IncTa2bxj9HoGuW5dfs0Vxb1qvsW9623dZt731rptS/9rxPbFnKYo0YygFcVLB9bTO/nMB5W1DVuHiqB6hMsyZ520IQR6McQAEG+pEs3oonZNtWKUiKoTMLulgqY0dKR3fslT7QWEB070o+pUqkq0VDVG1NW9I7qNVBs80rZ5omq2altIzfaliru2Zdpoer1RWrnXuWoQzILtuL4fQZOPDVs73ZrvrZ0kHxqy9Brp8exWOwhrtu9KnwNkU4ywp3X6svplWB3vSn05pNAZeRZLGu/2reDybtvSa6Xne6a1Wu0LAF+mCJqdzBY0O2EbruuYNhqsrXTLFcyNEs1AUlWBEfv77X492gkIGgDhqDoBCEfQAAhH0AAIR9AACPc3kAW2Ya9P81IAAAAASUVORK5CYII="},758:function(A,t,a){"use strict";a.r(t);var e=a(7),r=Object(e.a)({},(function(){var A=this,t=A.$createElement,e=A._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[e("p",[e("strong",[A._v("十进制转二进制")])]),A._v(" "),e("ul",[e("li",[A._v("整数部分:除2取余,直到商为0为止,逆序排列")]),A._v(" "),e("li",[A._v("小数部分:乘2取整,直到小数为0为止,顺序排列")]),A._v(" "),e("li",[A._v("合并")])]),A._v(" "),e("p",[e("strong",[A._v("二进制转十进制")])]),A._v(" "),e("ul",[e("li",[A._v("整数部分:从个位开始,给每一位标识2的N次方,N从0开始;依次将每一位的数字乘以2的N次方,再求和")]),A._v(" "),e("li",[A._v("小数部分:从小数点开始,给每一位标识2的负N次方,N从1开始;依次将每一位的数字乘以2的负N次方,再求和")]),A._v(" "),e("li",[A._v("求和")])]),A._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"center"}},[A._v("173")]),A._v(" "),e("th",{staticStyle:{"text-align":"center"}},[A._v("0.8125")])])]),A._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"center"}},[e("img",{attrs:{src:a(666)}})]),A._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("img",{attrs:{src:a(667)}})])])])]),A._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[A._v("十进制 173.8125 对应二进制 10101101.1101\n")])]),A._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[A._v("1")]),e("br")])]),e("p",[e("strong",[A._v("求负数的二进制")])]),A._v(" "),e("ol",[e("li",[e("p",[A._v("求原码:负数绝对值的二进制数")])]),A._v(" "),e("li",[e("p",[A._v("求反码:原码每位取反,0变1,1变0")])]),A._v(" "),e("li",[e("p",[A._v("求补码:反码+1")])])]),A._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[A._v("-173\t\t\n173\t\t\t绝对值\n10101101\t原码\n01010010\t反码\n01010011\t补码\n")])]),A._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[A._v("1")]),e("br"),e("span",{staticClass:"line-number"},[A._v("2")]),e("br"),e("span",{staticClass:"line-number"},[A._v("3")]),e("br"),e("span",{staticClass:"line-number"},[A._v("4")]),e("br"),e("span",{staticClass:"line-number"},[A._v("5")]),e("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/32.08f8d4b7.js b/assets/js/32.08f8d4b7.js new file mode 100644 index 00000000..42b0852c --- /dev/null +++ b/assets/js/32.08f8d4b7.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{668:function(s,t,a){s.exports=a.p+"assets/img/20240731205642.f474c67c.jpg"},669:function(s,t,a){s.exports=a.p+"assets/img/20240802225707.8e207dff.jpg"},760:function(s,t,a){"use strict";a.r(t);var e=a(7),n=Object(e.a)({},(function(){var s=this,t=s.$createElement,e=s._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("p",[s._v("首先,看一下电子邮件在互联网上的投递流程:")]),s._v(" "),e("p",[e("img",{attrs:{src:a(668),alt:""}})]),s._v(" "),e("p",[e("img",{attrs:{src:a(669),alt:""}})]),s._v(" "),e("ol",[e("li",[s._v("发件人调用用户代理编辑要发送的邮件。")]),s._v(" "),e("li",[s._v("发件人点击”发送邮件“按钮,把发送邮件的工作全部交给用户代理来完成。用户代理通过SMTP协议将邮件发送给发送方的邮件服务器(在这个过程中,用户代理充当SMTP客户,而发送方的邮件服务器则充当SMTP服务器)。")]),s._v(" "),e("li",[s._v("发送方的邮件服务器收到用户代理发来的邮件后,就把收到的邮件临时存放在邮件缓存队列中,等待时机成熟的时候再把邮件发送到接收方的邮件服务器(等待时间的长短取决于邮件服务器的处理能力和队列中待发送的信件的数量 )。")]),s._v(" "),e("li",[s._v("若时机成熟了,发送方的邮件服务器则向接收方的邮件服务器发送邮件缓存中的邮件。在发送邮件之前,发送方的邮件服务器的SMTP客户与接收方的邮件服务器的SMTP服务器需要事先建立TCP连接,之后再将队列中的邮件发送出去。值得注意的是,邮件不会在因特网中的某个中间邮件服务器落地 。")]),s._v(" "),e("li",[s._v("接收邮件服务器中的SMTP服务器进程在收到邮件后,把邮件放入收件人的用户邮箱中,等待收件人进行读取。")]),s._v(" "),e("li",[s._v("收件人在打开收信时,运行在PC机中的用户代理,使用POP3(或IMAP)协议读取发送给自己的邮件。 注意,在这个过程中,收件人是POP3(或IMAP)客户,而接收邮件服务器则是POP3(或IMAP)服务器,箭头的方向是从邮件服务器指向接收用户,因为这是一个“拉 ”的操作 。")])]),s._v(" "),e("p",[s._v("https://blog.csdn.net/suhuaiqiang_janlay/article/details/78765613")]),s._v(" "),e("h2",{attrs:{id:"mail-server与dns之间的关系"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mail-server与dns之间的关系"}},[s._v("#")]),s._v(" Mail server与DNS之间的关系")]),s._v(" "),e("p",[s._v("当一封邮件要发送出去时,邮件主机会先分析那封邮件的目标主机的DNS,先取得MX(Mail eXchanger,邮件交换)标志(其中,MX标志可能会有多部主机),然后以最优先MX主机为准将邮件发送出去。所以,若要为用户提供指定testmail域的电子邮件系统,需要先在DNS服务器中增加A记录和MX记录。\n@IN MX 10 mail.testmail.com\nmail IN A 192.168.200.20\n配置解析记录后,主机名即为mail.testmail.com,而邮件域为@testmail.com。")]),s._v(" "),e("h2",{attrs:{id:"邮件传输所需要的组件以及相关协议"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#邮件传输所需要的组件以及相关协议"}},[s._v("#")]),s._v(" 邮件传输所需要的组件以及相关协议")]),s._v(" "),e("p",[s._v("(1)工作流程\n邮件的正常传输是需要很多接口的,比如必须要先向某台邮件服务器注册,以取得一个合法的电子邮件权限后,才能够发送邮件出去。传输过程中包含了多个邮件重要组件。\n(2)相关组件\nMUA(Mial User Agent)邮件用户代理人\n收取邮件主机的电子邮件,以及提供用户浏览与编写邮件\nMTA(Mail Transfer Agent)邮件发送代理人\n使用简单邮件传输协议(SMTP);转发邮件\nMDA(Mail Delivery Agent)邮件传送代理人\n分析由MTA所收到的邮件表头或内容等数据,来决定这封邮件的去向。\n(3)邮件应用协议\n简单邮件传输协议(SMTP):\n用于发送或中转发出的电子邮件,占用tcp 25端口\n第三版邮件协议(POP3):\n用于把服务器上的邮件存储到本地主机,占用tcp110端口\n第四版互联网信息访问协议(IMAP4):\n用于再本地主机上访问邮件,占用tcp143端口")]),s._v(" "),e("h2",{attrs:{id:"常用的邮件系统框架"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#常用的邮件系统框架"}},[s._v("#")]),s._v(" 常用的邮件系统框架")]),s._v(" "),e("p",[s._v("一个最基础的电子邮件系统肯定要能提供发件服务和收件服务,为此需要使用基于SMTP协议的Postfix服务程序提供发件服务功能,并使用基于POP3协议的Dovecot服务程序提供收件服务功能,这样一来,用户就可以使用Outlook Express或Foxmail等客户端服务程序正常收发邮件了。\n1、MTA服务器:Postfix\n2、MRA服务器:Dvecot\n3、MUA软件:客户端的收发邮件软件\n应用Mail sever有两种主要方式:直接登录Linux主机来操作MTA,或者通过客户端的MUA软件来收发邮件。")]),s._v(" "),e("h2",{attrs:{id:"安装和配置-dovecot-imap-和-pop3-服务器"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#安装和配置-dovecot-imap-和-pop3-服务器"}},[s._v("#")]),s._v(" 安装和配置 Dovecot IMAP 和 POP3 服务器")]),s._v(" "),e("p",[s._v("Dovecot 是一个高性能邮件发送代理(MDA),专注于安全性。您可以使用 IMAP 或 POP3 兼容电子邮件客户端连接到 Dovecot 服务器,并读取或下载电子邮件。")]),s._v(" "),e("h3",{attrs:{id:"安装-dovecot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#安装-dovecot"}},[s._v("#")]),s._v(" 安装 Dovecot")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("yum -y "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" dovecot\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[e("a",{attrs:{href:"https://doc.dovecot.org/installation_guide/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://doc.dovecot.org/installation_guide/"),e("OutboundLink")],1)]),s._v(" "),e("h3",{attrs:{id:"配置-dovecot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#配置-dovecot"}},[s._v("#")]),s._v(" 配置 Dovecot")]),s._v(" "),e("p",[e("code",[s._v("dovecot")]),s._v(" 软件包提供主配置文件 "),e("code",[s._v("/etc/dovecot/dovecot.conf")]),s._v(" 和 "),e("code",[s._v("/etc/dovecot/conf.d/")]),s._v(" 目录中的多个配置文件。Dovecot 会在您启动服务时组合文件来构建配置。")]),s._v(" "),e("p",[s._v("多个配置文件的主要优点是对设置进行分组并提高可读性。如果您希望使用单个配置文件,可以维护 "),e("code",[s._v("/etc/dovecot/dovecot.conf")]),s._v(" 中的所有设置,并从 "),e("code",[s._v("该文件")]),s._v(" 中删除所有 "),e("code",[s._v("include_try")]),s._v(" 语句。")]),s._v(" "),e("p",[e("a",{attrs:{href:"https://doc.dovecot.org/configuration_manual/config_file/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://doc.dovecot.org/configuration_manual/config_file/"),e("OutboundLink")],1)]),s._v(" "),e("p",[e("a",{attrs:{href:"https://doc.dovecot.org/configuration_manual/basic_configuration/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://doc.dovecot.org/configuration_manual/basic_configuration/"),e("OutboundLink")],1)]),s._v(" "),e("h3",{attrs:{id:"参考资料"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#参考资料"}},[s._v("#")]),s._v(" 参考资料")]),s._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://doc.dovecot.org/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://doc.dovecot.org/"),e("OutboundLink")],1)]),s._v(" "),e("li",[e("a",{attrs:{href:"https://docs.redhat.com/zh_hans/documentation/red_hat_enterprise_linux/9/html/deploying_mail_servers/index",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.redhat.com/zh_hans/documentation/red_hat_enterprise_linux/9/html/deploying_mail_servers/index"),e("OutboundLink")],1)])]),s._v(" "),e("h2",{attrs:{id:"名词解释"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#名词解释"}},[s._v("#")]),s._v(" 名词解释")]),s._v(" "),e("p",[s._v("PAM(Pluggable Authentication Module)可插拔认证模块。")]),s._v(" "),e("p",[s._v("用Postfix构建的邮件系统至少有两种工作模式:")]),s._v(" "),e("ol",[e("li",[s._v("利用本地Linux账号进行邮件收发,比如本地系统有用户root或someone,那么就有root@example.com和someone@example.com两个email地址。")]),s._v(" "),e("li",[s._v("为了管理的方便和系统安全,Postfix的用户管理采用了虚拟用户方式,即Postfix单独设立了许多用户,他们各自在系统中映射有独立的硬盘空间。但同时这些用户又跟本地Linux系统内固有的真实账号没有关联。")])]),s._v(" "),e("p",[s._v("以下是在CentOS上搭建邮件服务器的基本步骤和示例配置:")]),s._v(" "),e("ol",[e("li",[e("p",[s._v("安装Postfix和Dovecot:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum -y "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" postfix dovecot\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("配置Postfix(主配置文件位于"),e("code",[s._v("/etc/postfix/main.cf")]),s._v("):")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 设置您的域名")]),s._v("\nmyhostname "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" mail.example.com\nmydomain "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" example.com\nmyorigin "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$mydomain")]),s._v("\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 设置邮件存储路径")]),s._v("\nhome_mailbox "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" Maildir/\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 指定允许的邮件大小")]),s._v("\nmailbox_size_limit "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v("\nmessage_size_limit "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("104857600")]),s._v("\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 用于发送邮件的网络接口")]),s._v("\ninet_interfaces "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" all\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 允许的邮局协议")]),s._v("\nmydestination "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$myhostname")]),s._v(", localhost."),e("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$mydomain")]),s._v(", localhost, "),e("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$mydomain")]),s._v("\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 要转发的邮件域")]),s._v("\nrelay_domains "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" *\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 设置网络范围以允许接收邮件")]),s._v("\nmynetworks "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.0/8 "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("::1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("/128\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启用SMTP认证")]),s._v("\nsmtpd_sasl_type "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" dovecot\nsmtpd_sasl_path "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" private/auth\nsmtpd_sasl_auth_enable "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("yes")]),s._v("\nsmtpd_recipient_restrictions "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重载配置")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" postfix reload\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br"),e("span",{staticClass:"line-number"},[s._v("12")]),e("br"),e("span",{staticClass:"line-number"},[s._v("13")]),e("br"),e("span",{staticClass:"line-number"},[s._v("14")]),e("br"),e("span",{staticClass:"line-number"},[s._v("15")]),e("br"),e("span",{staticClass:"line-number"},[s._v("16")]),e("br"),e("span",{staticClass:"line-number"},[s._v("17")]),e("br"),e("span",{staticClass:"line-number"},[s._v("18")]),e("br"),e("span",{staticClass:"line-number"},[s._v("19")]),e("br"),e("span",{staticClass:"line-number"},[s._v("20")]),e("br"),e("span",{staticClass:"line-number"},[s._v("21")]),e("br"),e("span",{staticClass:"line-number"},[s._v("22")]),e("br"),e("span",{staticClass:"line-number"},[s._v("23")]),e("br"),e("span",{staticClass:"line-number"},[s._v("24")]),e("br"),e("span",{staticClass:"line-number"},[s._v("25")]),e("br"),e("span",{staticClass:"line-number"},[s._v("26")]),e("br"),e("span",{staticClass:"line-number"},[s._v("27")]),e("br"),e("span",{staticClass:"line-number"},[s._v("28")]),e("br"),e("span",{staticClass:"line-number"},[s._v("29")]),e("br"),e("span",{staticClass:"line-number"},[s._v("30")]),e("br"),e("span",{staticClass:"line-number"},[s._v("31")]),e("br"),e("span",{staticClass:"line-number"},[s._v("32")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("配置Dovecot(主配置文件位于"),e("code",[s._v("/etc/dovecot/dovecot.conf")]),s._v("):")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 使POP3和IMAP可用")]),s._v("\nprotocols "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" imap pop3 lmtp\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 基于SASL的认证")]),s._v("\ndisable_plaintext_auth "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" no\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 设置邮件存储路径")]),s._v("\nmail_location "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" maildir:~/Maildir\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重启Dovecot服务")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl restart dovecot\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("确保Postfix和Dovecot服务开机自启:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" postfix\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" dovecot\n\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("配置防火墙允许SMTP和IMAP服务:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" firewall-cmd --permanent --add-service"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("smtp\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" firewall-cmd --permanent --add-service"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("imap\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" firewall-cmd --reload\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("测试邮件服务器:")]),s._v(" "),e("p",[s._v("使用如"),e("code",[s._v("telnet")]),s._v("或"),e("code",[s._v("swaks")]),s._v("等工具来测试邮件服务器的发送和接收功能。")]),s._v(" "),e("ul",[e("li",[e("p",[s._v("使用telnet测试SMTP:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("telnet localhost "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("25")]),s._v("\nhelo mail.example.com\nmail from:"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("from@example.com"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\nrcpt to:"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("to@example.com"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\ndata\nSubject: "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v(" email\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\nquit\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("使用telnet或其他邮件客户端测试IMAP/POP3。")])])])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/35.b4d9331a.js b/assets/js/35.b4d9331a.js new file mode 100644 index 00000000..36374fc7 --- /dev/null +++ b/assets/js/35.b4d9331a.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{603:function(s,n,t){s.exports=t.p+"assets/img/20211010124850.72f66b03.png"},705:function(s,n,t){"use strict";t.r(n);var a=t(7),e=Object(a.a)({},(function(){var s=this,n=s.$createElement,a=s._self._c||n;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("p",[s._v("下载地址:")]),s._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://nodejs.org/en/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://nodejs.org/en/"),a("OutboundLink")],1)])]),s._v(" "),a("p",[s._v("配置环境变量:")]),s._v(" "),a("ul",[a("li",[s._v("NODE_HOME = Node.js的安装目录")]),s._v(" "),a("li",[s._v("Path 添加 %NODE_HOME%;%NODE_HOME%\\npm_global")])]),s._v(" "),a("img",{attrs:{src:t(603)}}),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看 nodejs 版本")]),s._v("\nnode -v\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看 npm 版本")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" -v\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看所有 config 变量")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" config list\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置全局目录")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" config "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" prefix "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"D:'),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[s._v("\\\\")]),s._v("nodejs"),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[s._v("\\\\")]),s._v('npm_global"')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置缓存目录")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" config "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" cache "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"D:'),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[s._v("\\\\")]),s._v("nodejs"),a("span",{pre:!0,attrs:{class:"token entity",title:"\\\\"}},[s._v("\\\\")]),s._v('npm_cache"')]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置淘宝镜像")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" config "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" registry "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"https://registry.npmmirror.com"')]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# https://npmmirror.com/")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装 cnpm")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -g cnpm --registry"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("https://registry.npmmirror.com\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装运行时依赖")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" i -S "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("packname"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" i --save "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("packname"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装开发时依赖")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" i -D "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("packname"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" i --save-dev "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("packname"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 全局安装依赖")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" i -g "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("packname"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" i --global "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("packname"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 清缓存")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" cache clean -f\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br")])])])}),[],!1,null,null,null);n.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/36.19e4306e.js b/assets/js/36.19e4306e.js new file mode 100644 index 00000000..30dd9498 --- /dev/null +++ b/assets/js/36.19e4306e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{604:function(t,s,a){t.exports=a.p+"assets/img/20211204101015.79b2d707.jpg"},708:function(t,s,a){"use strict";a.r(s);var n=a(7),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h2",{attrs:{id:"修改终端"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#修改终端"}},[t._v("#")]),t._v(" 修改终端")]),t._v(" "),n("p",[t._v("按住Crtl+Shift+P,在弹出的窗体中输入Preferences:Open User Settings,找到"),n("img",{attrs:{src:a(604),alt:""}})]),t._v(" "),n("p",[t._v("在 setting.json 中编辑")]),t._v(" "),n("div",{staticClass:"language-json line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-json"}},[n("code",[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"terminal.integrated.profiles.windows"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"bash"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"path"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"D:\\\\Git\\\\bin\\\\bash.exe"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"args"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"terminal.integrated.defaultProfile.windows"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bash"')]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("h2",{attrs:{id:"格式化代码"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#格式化代码"}},[t._v("#")]),t._v(" 格式化代码")]),t._v(" "),n("p",[t._v("Shift + Alt + F")]),t._v(" "),n("h2",{attrs:{id:"生成-html-模板"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#生成-html-模板"}},[t._v("#")]),t._v(" 生成 HTML 模板")]),t._v(" "),n("p",[t._v("输入英文感叹号 "),n("code",[t._v("!")]),t._v(",然后按键盘的【Tab】键。")]),t._v(" "),n("h2",{attrs:{id:"插件"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#插件"}},[t._v("#")]),t._v(" 插件")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("插件")]),t._v(" "),n("th",[t._v("说明")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[t._v("open in browser")]),t._v(" "),n("td",[t._v("快速打开html文件到浏览器预览")])]),t._v(" "),n("tr",[n("td",[t._v("Npm Intellisense")]),t._v(" "),n("td",[t._v("可自动完成导入语句中的npm模块")])]),t._v(" "),n("tr",[n("td",[t._v("JavaScript (ES6) code snippets")]),t._v(" "),n("td",[t._v("ES6语法智能提示,以及快速输入")])]),t._v(" "),n("tr",[n("td",[t._v("GitLens")]),t._v(" "),n("td",[t._v("GitLens可以帮助您更好地理解代码。快速查看更改行或代码块的对象,功能强大,功能丰富且高度可定制,可以满足您的需求")])]),t._v(" "),n("tr",[n("td",[t._v("GitHistory")]),t._v(" "),n("td",[t._v("GitHistory可查看和搜索git日志以及图形和详细信息,同时还支持分支比较,分支管理等操作,非常方便")])])])])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/38.c97d3798.js b/assets/js/38.c97d3798.js new file mode 100644 index 00000000..c8e250be --- /dev/null +++ b/assets/js/38.c97d3798.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{566:function(s,n,a){s.exports=a.p+"assets/img/20220330160723.2eed4df6.png"},690:function(s,n,a){"use strict";a.r(n);var t=a(7),e=Object(t.a)({},(function(){var s=this,n=s.$createElement,t=s._self._c||n;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("p",[s._v("记录下在阿里云上使用Docker部署静态站点,支持HTTPS访问。")]),s._v(" "),t("h2",{attrs:{id:"准备工作"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#准备工作"}},[s._v("#")]),s._v(" 准备工作")]),s._v(" "),t("h3",{attrs:{id:"创建多个目录"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#创建多个目录"}},[s._v("#")]),s._v(" 创建多个目录")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -p 一次性创建层级目录,如果目录存在,则不创建")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" -p /opt/nginx /opt/nginx/config/conf.d /opt/nginx/html /opt/nginx/ssl\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("h3",{attrs:{id:"创建配置文件-nginx-conf"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#创建配置文件-nginx-conf"}},[s._v("#")]),s._v(" 创建配置文件 - nginx.conf")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /opt/nginx/nginx.conf\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("添加以下内容")]),s._v(" "),t("div",{staticClass:"language-conf line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v('user nginx;\nworker_processes auto;\n\nerror_log /var/log/nginx/error.log notice;\npid /var/run/nginx.pid;\n\nevents {\n worker_connections 1024;\n}\n\nhttp {\n include /etc/nginx/mime.types;\n default_type application/octet-stream;\n\n log_format main \'$remote_addr - $remote_user [$time_local] "$request" \'\n \'$status $body_bytes_sent "$http_referer" \'\n \'"$http_user_agent" "$http_x_forwarded_for"\';\n\n access_log /var/log/nginx/access.log main;\n\n sendfile on;\n #tcp_nopush on;\n\n keepalive_timeout 65;\n\n #gzip on;\n \n fastcgi_intercept_errors on;\n\n include /etc/nginx/conf.d/*.conf;\n}\n')])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br")])]),t("h3",{attrs:{id:"创建配置文件-default-conf"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#创建配置文件-default-conf"}},[s._v("#")]),s._v(" 创建配置文件 - default.conf")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /opt/nginx/config/conf.d/default.conf\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("添加以下内容")]),s._v(" "),t("div",{staticClass:"language-conf line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("server {\n listen 80;\n server_name maiamy.cn www.maiamy.cn;\n return 301 https://$host$request_uri;\n}\n\nserver {\n\tlisten 443 ssl;\n\tserver_name maiamy.cn www.maiamy.cn;\n\n\tssl_certificate /ssl/cert.pem; \n\tssl_certificate_key /ssl/cert.key;\n\n\tssl_session_cache shared:SSL:1m;\n\tssl_session_timeout 5m;\n\n\tssl_ciphers HIGH:!aNULL:!MD5;\n\tssl_prefer_server_ciphers on;\n\t\n\t# 解决:中文乱码\n\tcharset utf-8;\n\t\n\terror_page 404 /404.html;\n\terror_page 500 502 503 504 /50x.html;\n\n\tlocation / {\n\t\troot /usr/share/nginx/html;\n\t\tindex index.html index.htm;\n\t}\n}\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br")])]),t("h3",{attrs:{id:"上传静态页面"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#上传静态页面"}},[s._v("#")]),s._v(" 上传静态页面")]),s._v(" "),t("p",[s._v("将"),t("strong",[s._v("静态页面")]),s._v("上传到"),t("code",[s._v("/opt/nginx/html")])]),s._v(" "),t("h3",{attrs:{id:"上传ssl证书"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#上传ssl证书"}},[s._v("#")]),s._v(" 上传SSL证书")]),s._v(" "),t("p",[s._v("阿里云免费证书创建步骤:")]),s._v(" "),t("ol",[t("li",[t("p",[s._v("搜索“SSL 证书”")])]),s._v(" "),t("li",[t("p",[s._v("点击“SSL 证书(应用安全)”")])]),s._v(" "),t("li",[t("p",[s._v("点击“SSL 证书”")])]),s._v(" "),t("li",[t("p",[s._v("点击“免费证书”")])]),s._v(" "),t("li",[t("p",[s._v("点击“创建证书”,按提示输入相关内容")])]),s._v(" "),t("li",[t("p",[s._v("下载刚刚创建成功的证书")])]),s._v(" "),t("li",[t("p",[s._v("重命名证书,与default.conf配置一致")]),s._v(" "),t("ul",[t("li",[t("p",[s._v("xxx.key 改为 cert.key,对应default.conf的ssl_certificate_key")])]),s._v(" "),t("li",[t("p",[s._v("xxx.pem 改为 cert.pem,对应default.conf的ssl_certificate")])])])]),s._v(" "),t("li",[t("p",[s._v("将cert.key和cert.pem上传到"),t("code",[s._v("/opt/nginx/ssl")])])])]),s._v(" "),t("p",[t("img",{attrs:{src:a(566),alt:""}})]),s._v(" "),t("ol",{attrs:{start:"9"}},[t("li",[t("p",[s._v("如果SSL证书过期,则按1-8步骤操作,将新证书覆盖旧证书。然后重启容器即可。")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("docker "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ps")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 先停止容器再启动容器")]),s._v("\ndocker stop container_id\ndocker start container_id\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 或者重新启动容器")]),s._v("\ndocker restart container_id\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])])])]),s._v(" "),t("h2",{attrs:{id:"启动容器"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#启动容器"}},[s._v("#")]),s._v(" 启动容器")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("docker pull nginx\n\ndocker run --name nginx "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-v /opt/nginx/nginx.conf:/etc/nginx/nginx.conf "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-v /opt/nginx/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-v /opt/nginx/html:/usr/share/nginx/html "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-v /opt/nginx/ssl:/ssl "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--network"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("host "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d nginx\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br")])])])}),[],!1,null,null,null);n.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/40.ec1a42f2.js b/assets/js/40.ec1a42f2.js new file mode 100644 index 00000000..7182aa9a --- /dev/null +++ b/assets/js/40.ec1a42f2.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{602:function(s,a,t){s.exports=t.p+"assets/img/20221031095751.86ca0bc9.png"},700:function(s,a,t){"use strict";t.r(a);var e=t(7),n=Object(e.a)({},(function(){var s=this,a=s.$createElement,e=s._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("h2",{attrs:{id:"minikube"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#minikube"}},[s._v("#")]),s._v(" minikube")]),s._v(" "),e("p",[e("a",{attrs:{href:"https://minikube.sigs.k8s.io/docs/start/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://minikube.sigs.k8s.io/docs/start/"),e("OutboundLink")],1)]),s._v(" "),e("h3",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[s._v("#")]),s._v(" Installation")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -Uvh minikube-latest.x86_64.rpm\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("h3",{attrs:{id:"start-your-cluster"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#start-your-cluster"}},[s._v("#")]),s._v(" Start your cluster")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("useradd")]),s._v(" k8s\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("usermod")]),s._v(" -a -G docker k8s\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("passwd")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("su")]),s._v(" - k8s\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动集群")]),s._v("\nminikube start\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动集群")]),s._v("\nminikube start "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--driver"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("docker "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--kubernetes-version"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("v1.23.8 "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--image-mirror-country"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v("'cn'")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--image-repository"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v("'registry.cn-hangzhou.aliyuncs.com/google_containers'")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--extra-config"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("apiserver.service-node-port-range"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("30000")]),s._v("-65535\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 停止集群")]),s._v("\nminikube stop\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 获取集群状态")]),s._v("\nminikube status\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除集群")]),s._v("\nminikube delete\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看集群IP")]),s._v("\nminikube "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("ip")]),s._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看集群日志")]),s._v("\nminikube logs\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 打印minikube版本信息")]),s._v("\nminikube version\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br"),e("span",{staticClass:"line-number"},[s._v("12")]),e("br"),e("span",{staticClass:"line-number"},[s._v("13")]),e("br"),e("span",{staticClass:"line-number"},[s._v("14")]),e("br"),e("span",{staticClass:"line-number"},[s._v("15")]),e("br"),e("span",{staticClass:"line-number"},[s._v("16")]),e("br"),e("span",{staticClass:"line-number"},[s._v("17")]),e("br"),e("span",{staticClass:"line-number"},[s._v("18")]),e("br"),e("span",{staticClass:"line-number"},[s._v("19")]),e("br"),e("span",{staticClass:"line-number"},[s._v("20")]),e("br"),e("span",{staticClass:"line-number"},[s._v("21")]),e("br"),e("span",{staticClass:"line-number"},[s._v("22")]),e("br"),e("span",{staticClass:"line-number"},[s._v("23")]),e("br"),e("span",{staticClass:"line-number"},[s._v("24")]),e("br"),e("span",{staticClass:"line-number"},[s._v("25")]),e("br"),e("span",{staticClass:"line-number"},[s._v("26")]),e("br"),e("span",{staticClass:"line-number"},[s._v("27")]),e("br"),e("span",{staticClass:"line-number"},[s._v("28")]),e("br"),e("span",{staticClass:"line-number"},[s._v("29")]),e("br"),e("span",{staticClass:"line-number"},[s._v("30")]),e("br"),e("span",{staticClass:"line-number"},[s._v("31")]),e("br"),e("span",{staticClass:"line-number"},[s._v("32")]),e("br")])]),e("h3",{attrs:{id:"interact-with-your-cluster"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#interact-with-your-cluster"}},[s._v("#")]),s._v(" Interact with your cluster")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("minikube kubectl -- get pods -A\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# 修改.bashrc,添加 alias kubectl="minikube kubectl --"')]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" .bashrc\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 刷新.bashrc")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("source")]),s._v(" .bashrc\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 可以使用 kubectl 代替 minikube kubectl")]),s._v("\nkubectl get po -A\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br")])]),e("h3",{attrs:{id:"deploy-applications"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#deploy-applications"}},[s._v("#")]),s._v(" Deploy applications")]),s._v(" "),e("p",[s._v("Create a sample deployment and expose it on port 80:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl create deployment hello-minikube --image"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("docker.io/nginx:1.23\nkubectl expose deployment hello-minikube --type"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("NodePort --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("p",[s._v("It may take a moment, but your deployment will soon show up when you run:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k8s@k8s ~"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("$ minikube "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" hello-minikube\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-----------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("----------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("---------------------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" NAMESPACE "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" NAME "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" TARGET PORT "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" URL "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-----------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("----------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("---------------------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" default "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" hello-minikube "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" http://192.168.49.2:30831 "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-----------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("----------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("---------------------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n🎉 Opening "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" default/hello-minikube "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" default browser"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n👉 http://192.168.49.2:30831\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br")])]),e("p",[s._v("The easiest way to access this service is to let minikube launch a web browser for you:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k8s@k8s ~"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("$ minikube "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" hello-minikube\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-----------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("----------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("---------------------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" NAMESPACE "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" NAME "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" TARGET PORT "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" URL "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-----------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("----------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("---------------------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" default "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" hello-minikube "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" http://192.168.49.2:30831 "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-----------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("----------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("-------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("---------------------------"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("\n🎉 Opening "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" default/hello-minikube "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" default browser"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n👉 http://192.168.49.2:30831\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br")])]),e("p",[s._v("Alternatively, use kubectl to forward the port:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl port-forward service/hello-minikube --address "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.0")]),s._v(".0.0 "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v(":80\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("Tada! Your application is now available at http://localhost:8080/.")]),s._v(" "),e("h2",{attrs:{id:"dashboard"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dashboard"}},[s._v("#")]),s._v(" Dashboard")]),s._v(" "),e("p",[e("a",{attrs:{href:"https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/web-ui-dashboard/",target:"_blank",rel:"noopener noreferrer"}},[s._v("部署和访问 Kubernetes 仪表板(Dashboard)"),e("OutboundLink")],1)]),s._v(" "),e("p",[s._v("1、默认情况下不会部署 Dashboard。可以通过以下命令部署:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml\n\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /home/k8s\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("wget")]),s._v(" https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("mv")]),s._v(" recommended.yaml kubernetes-dashboard-v2.6.1.yaml\nkubectl apply -f /home/k8s/kubernetes-dashboard-v2.6.1.yaml\n\nkubectl delete -f /home/k8s/kubernetes-dashboard-v2.6.1.yaml\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br")])]),e("p",[s._v("2、为 Dashboard 添加外网访问:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl port-forward -n kubernetes-dashboard --address "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.0")]),s._v(".0.0 service/kubernetes-dashboard "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("8001")]),s._v(":443\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("访问 https://192.168.1.26:8001/ 即可")]),s._v(" "),e("p",[s._v("3、获取需要登录的token")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl get secret "),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),s._v("kubectl get serviceaccount dashboard -o "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("jsonpath")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{.secrets[0].name}"')]),e("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v(" -o "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("jsonpath")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"{.data.token}"')]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" base64 --decode\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("如果没有token,那就创建一个")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl create serviceaccount dashboard -n default\nkubectl create clusterrolebinding dashboard-admin -n default --clusterrole"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("cluster-admin --serviceaccount"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("default:dashboard\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("p",[s._v("error: listen tcp 127.0.0.1:8001: bind: address already in use")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 找到被占用的端口,以8001为例")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k8s@k8s ~"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("$ "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("netstat")]),s._v(" -tulpn "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("8001")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("Not all processes could be identified, non-owned process info\n will not be shown, you would have to be root to see it all."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\ntcp6 "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" :::8001 :::* LISTEN "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("9471")]),s._v("/kubectl\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 释放对应的端口,9471为对应的PID")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("kill")]),s._v(" -9 "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("9471")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br")])]),e("h2",{attrs:{id:"concepts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#concepts"}},[s._v("#")]),s._v(" Concepts")]),s._v(" "),e("p",[e("a",{attrs:{href:"https://kubernetes.io/docs/home/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://kubernetes.io/docs/home/"),e("OutboundLink")],1)]),s._v(" "),e("p",[s._v("资源创建方式有两种:")]),s._v(" "),e("ul",[e("li",[s._v("命令行")]),s._v(" "),e("li",[s._v("YAML")])]),s._v(" "),e("h3",{attrs:{id:"kubectl"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#kubectl"}},[s._v("#")]),s._v(" kubectl")]),s._v(" "),e("p",[s._v("kubectl 命令行的语法格式如下:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl --help\nkubectl "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("TYPE"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("NAME"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("flags"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("ul",[e("li",[e("p",[s._v("command:子命令,用于操作 k8s 集群资源对象的命令,例如 create、get、describe、delete。")]),s._v(" "),e("p",[s._v("更多命令见:"),e("a",{attrs:{href:"https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands"),e("OutboundLink")],1)])]),s._v(" "),e("li",[e("p",[s._v("TYPE:k8s 集群中资源对象的类型,区分大小写,能以单数、复数或者简写形式表示")]),s._v(" "),e("ul",[e("li",[e("p",[s._v("pod(po)")])]),s._v(" "),e("li",[e("p",[s._v("service(svc)")])]),s._v(" "),e("li",[e("p",[s._v("replication controller(rc)")])]),s._v(" "),e("li",[e("p",[s._v("deployment(deploy)")])]),s._v(" "),e("li",[e("p",[s._v("replica set(rs)")])])])])]),s._v(" "),e("img",{attrs:{src:t(602)}}),s._v(" "),e("ul",[e("li",[e("p",[s._v("NAME:k8s 集群中资源对象的名称,区分大小写。如果不指定名称,系统则返回属于 TYPE 的全部资源对象列表")])]),s._v(" "),e("li",[e("p",[s._v("flags:kubectl 子命令的可选参数")]),s._v(" "),e("p",[s._v("kubectl 每个子命令(如 create、get、describe、delete 等)还有特定的 flags 参数,可以通过")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" --help\nkubectl "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("TYPE"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" --help\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("p",[s._v("命令查看。")])])]),s._v(" "),e("h3",{attrs:{id:"namespace"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#namespace"}},[s._v("#")]),s._v(" Namespace")]),s._v(" "),e("p",[s._v("Namespace 默认只隔离资源,不隔离网络。语法格式:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" ns "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("NAME"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("flags"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\nkubectl "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" ns --help\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("p",[s._v("示例:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl get ns\nkubectl create ns namespace_name\nkubectl delete ns namespace_name\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看已存在命名空间的yaml配置")]),s._v("\nkubectl get ns namespace_name -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 导出已存在命名空间的yaml配置")]),s._v("\nkubectl get ns namespace_name -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" namespace.yaml\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看不存在命名空间的yaml配置")]),s._v("\nkubectl create ns namespace_name -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml --dry-run"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("client\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 导出不存在命名空间的yaml配置")]),s._v("\nkubectl create ns namespace_name -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml --dry-run"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("client "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" namespace.yaml\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br")])]),e("h3",{attrs:{id:"pod"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pod"}},[s._v("#")]),s._v(" Pod")]),s._v(" "),e("p",[s._v("Pod 运行中的一组容器,Pod是kubernetes的最小单位。")]),s._v(" "),e("p",[s._v("一个pod中可以部署多个container,同一个pod的container共享网络空间。")]),s._v(" "),e("p",[s._v("语法格式:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" pod "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("NAME"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("flags"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\nkubectl "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" pod --help\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("p",[s._v("示例:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看所有命名空间的pod")]),s._v("\nkubectl get pod -A\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看默认名称空间下的pod")]),s._v("\nkubectl get pod\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看指定名称空间下的pod")]),s._v("\nkubectl get pod -n namespace\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看默认名称空间下的pod(显示更加详细的信息)")]),s._v("\nkubectl get pod -owide\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 监听pod的变化")]),s._v("\nkubectl get pod -w\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Create and run a particular image in a pod.")]),s._v("\nkubectl run my-pod-nginx --image"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("docker.io/nginx:1.23 --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v("\nkubectl run my-pod-tomcat --image"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("docker.io/tomcat --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Show details of a specific resource or group of resources.")]),s._v("\nkubectl describe pod pod_name\nkubectl describe pod pod_name -n nameapace\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Print the logs for a container in a pod or specified resource. If the pod has only one container, the container name is optional.")]),s._v("\nkubectl logs pod_name\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Execute a command in a container.")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...]")]),s._v("\nkubectl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exec")]),s._v(" -it pod_name -- /bin/bash\n\nkubectl delete pod pod_name\nkubectl delete -n default pod pod_name\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看已存在pod的yaml配置")]),s._v("\nkubectl get pod my-pod-nginx -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 导出已存在pod的yaml配置")]),s._v("\nkubectl get pod my-pod-nginx -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" pod.yaml\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看不存在pod的yaml配置")]),s._v("\nkubectl run my-pod-nginx --image"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("docker.io/nginx:1.23 --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(" -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml --dry-run"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("client\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 导出不存在pod的yaml配置")]),s._v("\nkubectl run my-pod-nginx --image"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("docker.io/nginx:1.23 --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(" -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml --dry-run"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("client "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" pod.yaml\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br"),e("span",{staticClass:"line-number"},[s._v("12")]),e("br"),e("span",{staticClass:"line-number"},[s._v("13")]),e("br"),e("span",{staticClass:"line-number"},[s._v("14")]),e("br"),e("span",{staticClass:"line-number"},[s._v("15")]),e("br"),e("span",{staticClass:"line-number"},[s._v("16")]),e("br"),e("span",{staticClass:"line-number"},[s._v("17")]),e("br"),e("span",{staticClass:"line-number"},[s._v("18")]),e("br"),e("span",{staticClass:"line-number"},[s._v("19")]),e("br"),e("span",{staticClass:"line-number"},[s._v("20")]),e("br"),e("span",{staticClass:"line-number"},[s._v("21")]),e("br"),e("span",{staticClass:"line-number"},[s._v("22")]),e("br"),e("span",{staticClass:"line-number"},[s._v("23")]),e("br"),e("span",{staticClass:"line-number"},[s._v("24")]),e("br"),e("span",{staticClass:"line-number"},[s._v("25")]),e("br"),e("span",{staticClass:"line-number"},[s._v("26")]),e("br"),e("span",{staticClass:"line-number"},[s._v("27")]),e("br"),e("span",{staticClass:"line-number"},[s._v("28")]),e("br"),e("span",{staticClass:"line-number"},[s._v("29")]),e("br"),e("span",{staticClass:"line-number"},[s._v("30")]),e("br"),e("span",{staticClass:"line-number"},[s._v("31")]),e("br"),e("span",{staticClass:"line-number"},[s._v("32")]),e("br"),e("span",{staticClass:"line-number"},[s._v("33")]),e("br"),e("span",{staticClass:"line-number"},[s._v("34")]),e("br"),e("span",{staticClass:"line-number"},[s._v("35")]),e("br"),e("span",{staticClass:"line-number"},[s._v("36")]),e("br"),e("span",{staticClass:"line-number"},[s._v("37")]),e("br")])]),e("h3",{attrs:{id:"deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#deployment"}},[s._v("#")]),s._v(" Deployment")]),s._v(" "),e("p",[s._v("Deployment 控制 Pod,使Pod拥有多个副本,自愈、扩容等功能。")]),s._v(" "),e("p",[s._v("语法格式:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" deploy "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("NAME"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("flags"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\nkubectl "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" deploy --help\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("p",[s._v("示例:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl get deployment\n\nkubectl create deployment my-deploy-nginx --image"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("docker.io/nginx:1.23\nkubectl create deployment my-deploy-nginx --image"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("docker.io/nginx:1.23 --replicas"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v("\n\nkubectl expose deployment my-deploy-nginx --target-port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(" --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("10080")]),s._v(" --type"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("NodePort --name my-deploy-nginx-svc\n\nkubectl edit deployment my-deploy-nginx\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 扩容")]),s._v("\nkubectl scale --current-replicas"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" --replicas"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" deployment/my-deploy-nginx\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 缩容")]),s._v("\nkubectl scale --current-replicas"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v(" --replicas"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" deployment/my-deploy-nginx\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 滚动更新/不停机维护")]),s._v("\nkubectl "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("set")]),s._v(" image deployment/my-deploy-nginx "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("nginx")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("nginx:1.9.1 --record\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看历史记录")]),s._v("\nkubectl rollout "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("history")]),s._v(" deployment/my-deploy-nginx\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 版本回退")]),s._v("\nkubectl rollout undo deployment/my-deploy-nginx --to-revision"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n\nkubectl delete deployment my-deploy-nginx\nkubectl delete -n default deployment my-deploy-nginx\n\nkubectl get deployment my-deploy-nginx -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml\nkubectl get deployment my-deploy-nginx -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" deployment.yaml\nkubectl create deployment my-deploy-nginx --image"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("docker.io/nginx:1.23 --replicas"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml --dry-run"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("client "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" deployment.yaml\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br"),e("span",{staticClass:"line-number"},[s._v("12")]),e("br"),e("span",{staticClass:"line-number"},[s._v("13")]),e("br"),e("span",{staticClass:"line-number"},[s._v("14")]),e("br"),e("span",{staticClass:"line-number"},[s._v("15")]),e("br"),e("span",{staticClass:"line-number"},[s._v("16")]),e("br"),e("span",{staticClass:"line-number"},[s._v("17")]),e("br"),e("span",{staticClass:"line-number"},[s._v("18")]),e("br"),e("span",{staticClass:"line-number"},[s._v("19")]),e("br"),e("span",{staticClass:"line-number"},[s._v("20")]),e("br"),e("span",{staticClass:"line-number"},[s._v("21")]),e("br"),e("span",{staticClass:"line-number"},[s._v("22")]),e("br"),e("span",{staticClass:"line-number"},[s._v("23")]),e("br"),e("span",{staticClass:"line-number"},[s._v("24")]),e("br"),e("span",{staticClass:"line-number"},[s._v("25")]),e("br"),e("span",{staticClass:"line-number"},[s._v("26")]),e("br")])]),e("h3",{attrs:{id:"service"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#service"}},[s._v("#")]),s._v(" Service")]),s._v(" "),e("p",[s._v("Service ,将一组Pods公开为网络服务的抽象方法,Pod的服务发现和负载均衡。")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Expose a resource as a new Kubernetes service.")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# type: Type for this service: ClusterIP, NodePort, LoadBalancer, or ExternalName. Default is 'ClusterIP'.")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# --type=ClusterIP: 仅仅集群内访问")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# --type=NodePort: 集群外可以访问")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# --port: The port that the service should serve on.")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# --target-port: Name or number for the port on the container that the service should direct traffic to")]),s._v("\nkubectl expose pod my-pod-nginx --target-port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(" --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("10080")]),s._v(" --type"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("NodePort --name my-pod-nginx-svc\nkubectl expose pod my-pod-tomcat --target-port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v(" --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("18080")]),s._v(" --type"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("NodePort --name my-pod-tomcat-svc\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看已存在svc的yaml配置")]),s._v("\nkubectl get svc my-pod-nginx -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 导出已存在svc的yaml配置")]),s._v("\nkubectl get svc my-pod-nginx -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" service.yaml\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看不存在svc的yaml配置")]),s._v("\nkubectl expose pod my-pod-nginx --target-port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(" --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("10080")]),s._v(" --type"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("NodePort --name my-pod-nginx-svc -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml --dry-run"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("client\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 导出不存在svc的yaml配置")]),s._v("\nkubectl expose pod my-pod-nginx --target-port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(" --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("10080")]),s._v(" --type"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("NodePort --name my-pod-nginx-svc -o"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("yaml --dry-run"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("client "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" service.yaml\n\nkubectl get "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v("\nkubectl get svc\nkubectl delete svc my-pod-nginx\nkubectl delete -n default "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" my-pod-nginx\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br"),e("span",{staticClass:"line-number"},[s._v("12")]),e("br"),e("span",{staticClass:"line-number"},[s._v("13")]),e("br"),e("span",{staticClass:"line-number"},[s._v("14")]),e("br"),e("span",{staticClass:"line-number"},[s._v("15")]),e("br"),e("span",{staticClass:"line-number"},[s._v("16")]),e("br"),e("span",{staticClass:"line-number"},[s._v("17")]),e("br"),e("span",{staticClass:"line-number"},[s._v("18")]),e("br"),e("span",{staticClass:"line-number"},[s._v("19")]),e("br"),e("span",{staticClass:"line-number"},[s._v("20")]),e("br"),e("span",{staticClass:"line-number"},[s._v("21")]),e("br"),e("span",{staticClass:"line-number"},[s._v("22")]),e("br")])]),e("h3",{attrs:{id:"ingress"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ingress"}},[s._v("#")]),s._v(" Ingress")]),s._v(" "),e("p",[s._v("Ingress用于实现用域名访问k8s内部应用。")]),s._v(" "),e("p",[e("a",{attrs:{href:"https://kubernetes.github.io/ingress-nginx/deploy/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://kubernetes.github.io/ingress-nginx/deploy/"),e("OutboundLink")],1)]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("minikube addons "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" ingress\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("h3",{attrs:{id:"yaml"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#yaml"}},[s._v("#")]),s._v(" YAML")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("kubectl apply -f xxx.yaml\nkubectl delete -f xxx.yaml\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("h2",{attrs:{id:"example"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#example"}},[s._v("#")]),s._v(" Example")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 创建pod")]),s._v("\nkubectl run my-pod-nginx --image"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("docker.io/nginx:1.23 --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v("\nkubectl run my-pod-tomcat --image"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("docker.io/tomcat --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 容器内访问")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 分别进入my-pod-nginx和my-pod-tomcat容器内部,执行如下命令:")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" localhost:80\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" localhost:8080\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 为pod创建svc")]),s._v("\nkubectl expose pod my-pod-nginx --target-port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(" --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("10080")]),s._v(" --type"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("NodePort --name my-pod-nginx-svc\nkubectl expose pod my-pod-tomcat --target-port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v(" --port"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("18080")]),s._v(" --type"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("NodePort --name my-pod-tomcat-svc\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看svc")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 10080:37442/TCP,10080用于集群内访问,37442用于集群外访问")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k8s@k8s ~"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("$ kubectl get svc\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("S"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" AGE\nkubernetes ClusterIP "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("10.96")]),s._v(".0.1 "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("none"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("443")]),s._v("/TCP 53d\nmy-pod-nginx-svc NodePort "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("10.100")]),s._v(".244.81 "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("none"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("10080")]),s._v(":37442/TCP 104s\nmy-pod-tomcat-svc NodePort "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("10.103")]),s._v(".126.25 "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("none"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("18080")]),s._v(":58008/TCP 2s\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 集群内访问")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在pod中可以通过serviceIp:port或者serviceName.namespace.svc:port访问其他pod")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 进入my-pod-nginx容器内部,访问tomcat")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" my-pod-tomcat-svc.default.svc:18080\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 进入my-pod-tomcat容器内部,访问nginx")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" my-pod-nginx-svc.default.svc:10080\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 集群外访问(在宿主机中)")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k8s@k8s ~"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("$ minikube "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("ip")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".49.2\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("k8s@k8s ~"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("$ "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("curl")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".49.2:37442\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v("DOCTYPE html"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("html"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("head"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("title"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("Welcome to nginx"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/title"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("style"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\nhtml "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" color-scheme: light dark"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\nbody "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" width: 35em"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" margin: "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" auto"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nfont-family: Tahoma, Verdana, Arial, sans-serif"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/style"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/head"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("body"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("h"),e("span",{pre:!0,attrs:{class:"token operator"}},[e("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("1")]),s._v(">")]),s._v("Welcome to nginx"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/h"),e("span",{pre:!0,attrs:{class:"token operator"}},[e("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("1")]),s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("p"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required."),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/p"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("p"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("For online documentation and support please refer to\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("a "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("href")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"http://nginx.org/"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("nginx.org"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/a"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("."),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("br/"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\nCommercial support is available at\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("a "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("href")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"http://nginx.com/"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("nginx.com"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/a"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("."),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/p"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("p"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("em"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("Thank you "),e("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" using nginx."),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/em"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/p"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/body"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/html"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 集群外访问(在浏览器中)")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#port-forward")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Forward one or more local ports to a pod. ")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# kubectl port-forward TYPE/NAME [options] [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N]")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Listen on port 37442 on all addresses, forwarding to 80 in the pod. Press Ctrl+C to end port exposure. Enter in the browser address bar http://192.168.1.26:37442/")]),s._v("\nkubectl port-forward --address "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.0")]),s._v(".0.0 pod/my-pod-nginx "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("37442")]),s._v(":80\nkubectl port-forward --address "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.0")]),s._v(".0.0 pod/my-pod-tomcat "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("58008")]),s._v(":8080\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br"),e("span",{staticClass:"line-number"},[s._v("12")]),e("br"),e("span",{staticClass:"line-number"},[s._v("13")]),e("br"),e("span",{staticClass:"line-number"},[s._v("14")]),e("br"),e("span",{staticClass:"line-number"},[s._v("15")]),e("br"),e("span",{staticClass:"line-number"},[s._v("16")]),e("br"),e("span",{staticClass:"line-number"},[s._v("17")]),e("br"),e("span",{staticClass:"line-number"},[s._v("18")]),e("br"),e("span",{staticClass:"line-number"},[s._v("19")]),e("br"),e("span",{staticClass:"line-number"},[s._v("20")]),e("br"),e("span",{staticClass:"line-number"},[s._v("21")]),e("br"),e("span",{staticClass:"line-number"},[s._v("22")]),e("br"),e("span",{staticClass:"line-number"},[s._v("23")]),e("br"),e("span",{staticClass:"line-number"},[s._v("24")]),e("br"),e("span",{staticClass:"line-number"},[s._v("25")]),e("br"),e("span",{staticClass:"line-number"},[s._v("26")]),e("br"),e("span",{staticClass:"line-number"},[s._v("27")]),e("br"),e("span",{staticClass:"line-number"},[s._v("28")]),e("br"),e("span",{staticClass:"line-number"},[s._v("29")]),e("br"),e("span",{staticClass:"line-number"},[s._v("30")]),e("br"),e("span",{staticClass:"line-number"},[s._v("31")]),e("br"),e("span",{staticClass:"line-number"},[s._v("32")]),e("br"),e("span",{staticClass:"line-number"},[s._v("33")]),e("br"),e("span",{staticClass:"line-number"},[s._v("34")]),e("br"),e("span",{staticClass:"line-number"},[s._v("35")]),e("br"),e("span",{staticClass:"line-number"},[s._v("36")]),e("br"),e("span",{staticClass:"line-number"},[s._v("37")]),e("br"),e("span",{staticClass:"line-number"},[s._v("38")]),e("br"),e("span",{staticClass:"line-number"},[s._v("39")]),e("br"),e("span",{staticClass:"line-number"},[s._v("40")]),e("br"),e("span",{staticClass:"line-number"},[s._v("41")]),e("br"),e("span",{staticClass:"line-number"},[s._v("42")]),e("br"),e("span",{staticClass:"line-number"},[s._v("43")]),e("br"),e("span",{staticClass:"line-number"},[s._v("44")]),e("br"),e("span",{staticClass:"line-number"},[s._v("45")]),e("br"),e("span",{staticClass:"line-number"},[s._v("46")]),e("br"),e("span",{staticClass:"line-number"},[s._v("47")]),e("br"),e("span",{staticClass:"line-number"},[s._v("48")]),e("br"),e("span",{staticClass:"line-number"},[s._v("49")]),e("br"),e("span",{staticClass:"line-number"},[s._v("50")]),e("br"),e("span",{staticClass:"line-number"},[s._v("51")]),e("br"),e("span",{staticClass:"line-number"},[s._v("52")]),e("br"),e("span",{staticClass:"line-number"},[s._v("53")]),e("br"),e("span",{staticClass:"line-number"},[s._v("54")]),e("br"),e("span",{staticClass:"line-number"},[s._v("55")]),e("br"),e("span",{staticClass:"line-number"},[s._v("56")]),e("br"),e("span",{staticClass:"line-number"},[s._v("57")]),e("br"),e("span",{staticClass:"line-number"},[s._v("58")]),e("br"),e("span",{staticClass:"line-number"},[s._v("59")]),e("br"),e("span",{staticClass:"line-number"},[s._v("60")]),e("br"),e("span",{staticClass:"line-number"},[s._v("61")]),e("br"),e("span",{staticClass:"line-number"},[s._v("62")]),e("br"),e("span",{staticClass:"line-number"},[s._v("63")]),e("br")])]),e("h2",{attrs:{id:"q-a"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#q-a"}},[s._v("#")]),s._v(" Q&A")]),s._v(" "),e("h3",{attrs:{id:"service类型"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#service类型"}},[s._v("#")]),s._v(" Service类型")]),s._v(" "),e("ol",[e("li",[e("p",[s._v("ClusterIP(集群IP):在集群内使用,也是默认值。")])]),s._v(" "),e("li",[e("p",[s._v("ExternalName(外部名称):将 Service 映射到 DNS 名称")]),s._v(" "),e("div",{staticClass:"language-yaml line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-yaml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("apiVersion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" v1\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("kind")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" Service\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("metadata")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" my"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("service\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spec")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" ExternalName\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("externalName")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" my.database.example.com\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("LoadBalancer(负载均衡器)")])]),s._v(" "),e("li",[e("p",[s._v("NodePort(节点端口):在集群外可以访问,有效的端口号范围是 30000-32767。")]),s._v(" "),e("p",[s._v("如果不够的话,可以通过如下命令进行扩展:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("minikube start --extra-config"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("apiserver.service-node-port-range"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("-65535\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("div",{staticClass:"language-yaml line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-yaml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("apiVersion")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" v1\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("kind")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" Service\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("metadata")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" my"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("frontend"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("service\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("spec")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("type")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" NodePort\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("selector")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("app")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" web\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("ports")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" http\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("protocol")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" TCP\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("targetPort")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nodePort")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("30000")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 30000-32767, Optional field")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br"),e("span",{staticClass:"line-number"},[s._v("12")]),e("br"),e("span",{staticClass:"line-number"},[s._v("13")]),e("br"),e("span",{staticClass:"line-number"},[s._v("14")]),e("br")])])])]),s._v(" "),e("h3",{attrs:{id:"pod三种探针"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pod三种探针"}},[s._v("#")]),s._v(" Pod三种探针")]),s._v(" "),e("p",[s._v("StartupProbe:k8s 1.16版本后新加的探测方式,"),e("strong",[s._v("用于判断容器内应用程序是否已经启动")]),s._v("。如果配置了startupProbe,就会先禁止其他的探测,直到它成功为止,成功后将不再进行探测。比较适用于容器启动时间长的场景。若没有配置该探针,默认就是success。")]),s._v(" "),e("p",[s._v("LivenessProbe:"),e("strong",[s._v("用于探测容器是否运行")]),s._v(",如果探测失败,kubelet会根据配置的重启策略进行相应的处理。若没有配置该探针,默认就是success。")]),s._v(" "),e("p",[s._v("ReadinessProbe:一般"),e("strong",[s._v("用于探测容器内的程序是否健康")]),s._v(",它的返回值如果为success,那么就代表这个容器已经完成启动,并且程序已经是可以接受流量的状态。")]),s._v(" "),e("div",{staticClass:"language-yaml line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-yaml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("startupProbe")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 指定探针探测方式为HTTPGetAction。")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("httpGet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("path")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" /api/healthcheck\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("livenessProbe")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("httpGet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("path")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" /api/healthcheck\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v(" \n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("initialDelaySeconds")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("periodSeconds")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("3")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("readinessProbe")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("httpGet")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("path")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" /api/healthcheck\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("port")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br"),e("span",{staticClass:"line-number"},[s._v("10")]),e("br"),e("span",{staticClass:"line-number"},[s._v("11")]),e("br"),e("span",{staticClass:"line-number"},[s._v("12")]),e("br"),e("span",{staticClass:"line-number"},[s._v("13")]),e("br"),e("span",{staticClass:"line-number"},[s._v("14")]),e("br"),e("span",{staticClass:"line-number"},[s._v("15")]),e("br")])]),e("p",[s._v("探针的探测方式:")]),s._v(" "),e("ol",[e("li",[s._v("ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康。")]),s._v(" "),e("li",[s._v("TCPSocketAction:通过TCP连接检查容器内的端口是否通的,如果是通的就认为容器健康。")]),s._v(" "),e("li",[s._v("HTTPGetAction:通过应用程序暴露的API地址检查程序是否正常,如果状态码为200~400之间,则认为容器健康。(常用)")])]),s._v(" "),e("p",[s._v("探针的检查参数:")]),s._v(" "),e("div",{staticClass:"language-yaml line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-yaml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("initialDelaySeconds")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("60")]),s._v("\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 初始化时间,指定探针多少秒后启动")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("timeoutSeconds")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v("\t\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 超时时间")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("periodSeconds")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("5")]),s._v("\t\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检测间隔,指定探针的探测周期")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("successThreshold")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\t\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查成功为1次表示就绪")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("failureThreshold")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v("\t\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检测失败2次表示未就绪")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br")])]),e("h3",{attrs:{id:"访问tomcat出现404"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#访问tomcat出现404"}},[s._v("#")]),s._v(" 访问Tomcat出现404")]),s._v(" "),e("p",[s._v("进入容器内部,"),e("code",[s._v("ls")]),s._v(" 查看文件夹,发现有个空的"),e("code",[s._v("webapps")]),s._v(",但是有另外一个"),e("code",[s._v("webapp.dist")]),s._v("里面有相关的文件,将"),e("code",[s._v("webapp.dist")]),s._v("的文件拷贝过来即可。")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" -r webapps.dist/* ./webapps\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("h3",{attrs:{id:"修改nginx首页"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#修改nginx首页"}},[s._v("#")]),s._v(" 修改Nginx首页")]),s._v(" "),e("p",[s._v("进入容器内部,执行")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"111"')]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" /usr/share/nginx/html/index.html\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("h2",{attrs:{id:"links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#links"}},[s._v("#")]),s._v(" Links")]),s._v(" "),e("p",[e("a",{attrs:{href:"https://www.bilibili.com/video/BV13Q4y1C7hS",target:"_blank",rel:"noopener noreferrer"}},[s._v("云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps"),e("OutboundLink")],1)]),s._v(" "),e("p",[e("a",{attrs:{href:"https://www.bilibili.com/video/BV16Z4y1b74y/",target:"_blank",rel:"noopener noreferrer"}},[s._v("(2022版)最新、最全、最详细的Kubernetes(K8s)教程,从K8s安装到实战一套搞定"),e("OutboundLink")],1)])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/41.0d11a7ba.js b/assets/js/41.0d11a7ba.js new file mode 100644 index 00000000..be0ffa9d --- /dev/null +++ b/assets/js/41.0d11a7ba.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{610:function(t,a,s){t.exports=s.p+"assets/img/20201122134001.0d972506.png"},721:function(t,a,s){"use strict";s.r(a);var n=s(7),e=Object(n.a)({},(function(){var t=this,a=t.$createElement,n=t._self._c||a;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h2",{attrs:{id:"_1-基本概念与术语"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-基本概念与术语"}},[t._v("#")]),t._v(" 1 基本概念与术语")]),t._v(" "),n("h3",{attrs:{id:"_1-1-进程与线程"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-1-进程与线程"}},[t._v("#")]),t._v(" 1.1 进程与线程")]),t._v(" "),n("p",[t._v("进程是操作系统分配资源的基本单位。线程是处理器任务调度和执行的基本单位。一个进程包含一个或多个线程。")]),t._v(" "),n("p",[t._v("进程是相互独立的,每个进程都有独立的代码和数据空间(程序上下文),进程的切换会有较大的开销。同一进程的线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换开销小。")]),t._v(" "),n("p",[t._v("一个进程崩溃后,一般不会影响到其他进程。一个线程崩溃可能会导致整个进程死掉。")]),t._v(" "),n("blockquote",[n("p",[t._v("举例:WPS是一个进程,我们在打字的同时,WPS可以进行拼写检查,打字跟拼写检查可以理解为两个线程。")])]),t._v(" "),n("h3",{attrs:{id:"_1-2-并行与并发"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-2-并行与并发"}},[t._v("#")]),t._v(" 1.2 并行与并发")]),t._v(" "),n("p",[t._v("串行:在"),n("strong",[t._v("同一时刻")]),t._v(",有"),n("strong",[t._v("一个任务")]),t._v("在"),n("strong",[t._v("单个CPU")]),t._v("上"),n("strong",[t._v("依次执行")]),t._v("。")]),t._v(" "),n("p",[t._v("并行:在"),n("strong",[t._v("同一时刻")]),t._v(",有"),n("strong",[t._v("多个任务")]),t._v("在"),n("strong",[t._v("多个CPU")]),t._v("上"),n("strong",[t._v("同时执行")]),t._v("。")]),t._v(" "),n("p",[t._v("并发:在"),n("strong",[t._v("同一时刻")]),t._v(",有"),n("strong",[t._v("多个任务")]),t._v("在"),n("strong",[t._v("单个CPU")]),t._v("上"),n("strong",[t._v("交替执行")]),t._v("。")]),t._v(" "),n("h3",{attrs:{id:"_1-3-线程调度"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-3-线程调度"}},[t._v("#")]),t._v(" 1.3 线程调度")]),t._v(" "),n("h4",{attrs:{id:"_1-3-1-线程并发执行"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-3-1-线程并发执行"}},[t._v("#")]),t._v(" 1.3.1 线程并发执行")]),t._v(" "),n("p",[t._v("计算机中的CPU,在任意时刻只能执行一条机器指令,每个线程只有获得CPU的使用权才能执行代码。各个线程轮流获得CPU的使用权,分别执行各自的任务。")]),t._v(" "),n("h4",{attrs:{id:"_1-3-2-线程调度模型"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-3-2-线程调度模型"}},[t._v("#")]),t._v(" 1.3.2 线程调度模型")]),t._v(" "),n("p",[t._v("分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU时间片。\n抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选取一个,优先级高的线程获取CPU的时间片相对多一些。")]),t._v(" "),n("h3",{attrs:{id:"_1-4-可重入锁"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-4-可重入锁"}},[t._v("#")]),t._v(" 1.4 可重入锁")]),t._v(" "),n("p",[t._v("JVM允许同一个线程重复获取同一个锁,被同一个线程反复获取的锁,叫做可重入锁。")]),t._v(" "),n("h3",{attrs:{id:"_1-5-死锁"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_1-5-死锁"}},[t._v("#")]),t._v(" 1.5 死锁")]),t._v(" "),n("p",[t._v("线程死锁,是由于两个或更多的线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法继续执行。")]),t._v(" "),n("p",[t._v("死锁是因为锁的嵌套产生的,所以避免死锁的根本就是要避免锁的嵌套。多线程获取锁的顺序要一致。")]),t._v(" "),n("h2",{attrs:{id:"_2-创建线程的方式"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-创建线程的方式"}},[t._v("#")]),t._v(" 2 创建线程的方式")]),t._v(" "),n("h3",{attrs:{id:"_2-1-继承thread类"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-1-继承thread类"}},[t._v("#")]),t._v(" 2.1 继承Thread类")]),t._v(" "),n("p",[t._v("继承Thread类,并重写run方法。")]),t._v(" "),n("h3",{attrs:{id:"_2-2-实现runnable接口"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-2-实现runnable接口"}},[t._v("#")]),t._v(" 2.2 实现Runnable接口")]),t._v(" "),n("p",[t._v("实现Runnable接口,并重写run方法。")]),t._v(" "),n("h3",{attrs:{id:"_2-3-实现callable接口"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-3-实现callable接口"}},[t._v("#")]),t._v(" 2.3 实现Callable接口")]),t._v(" "),n("p",[t._v("实现Callable接口,并重写call方法。")]),t._v(" "),n("p",[t._v("call方法有返回值的,可以抛出异常。Callable接口支持泛型。实现Callable接口的派生类需要结合FutureTask一起使用。")]),t._v(" "),n("p",[t._v("JDK5新增的。")]),t._v(" "),n("blockquote",[n("ul",[n("li",[t._v("Future可以对Runnable、Callable任务的执行结果进行取消、查询是否完成、获取结果等。")]),t._v(" "),n("li",[t._v("FutureTask是Future接口唯一的实现类")]),t._v(" "),n("li",[t._v("FutureTask同时实现了Runnable、Future接口。它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。")])])]),t._v(" "),n("h3",{attrs:{id:"_2-4-线程池"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_2-4-线程池"}},[t._v("#")]),t._v(" 2.4 线程池")]),t._v(" "),n("p",[t._v("提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁,实现重复利用。")]),t._v(" "),n("p",[t._v("JDK5新增的。")]),t._v(" "),n("p",[t._v("ExecutorService接口 + Executors工具类")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 创建固定大小的线程池")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ExecutorService")]),t._v(" executorService "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Executors")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("newFixedThreadPool")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 提交任务")]),t._v("\nexecutorService"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("execute")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("task1"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nexecutorService"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("submit")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("task2"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br")])]),n("h2",{attrs:{id:"_3-线程的生命周期"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_3-线程的生命周期"}},[t._v("#")]),t._v(" 3 线程的生命周期")]),t._v(" "),n("p",[n("img",{attrs:{src:s(610),alt:""}})]),t._v(" "),n("p",[t._v("1、当new Thread时,线程处于新建状态;")]),t._v(" "),n("p",[t._v("2、当调用start方法时或sleep方法时间到/阻塞结束,线程处于就绪状态;")]),t._v(" "),n("p",[t._v("3、当线程抢到CPU的执行权时,线程处于运行状态;")]),t._v(" "),n("p",[t._v("4、当线程执行到sleep方法或其他阻塞方法时,线程处于阻塞状态;")]),t._v(" "),n("p",[t._v("5、当run方法结束时,线程处于死亡状态。")]),t._v(" "),n("h2",{attrs:{id:"_4-线程的安全问题"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-线程的安全问题"}},[t._v("#")]),t._v(" 4 线程的安全问题")]),t._v(" "),n("p",[t._v("解决线程之间共享数据的安全问题有以下3种方式。")]),t._v(" "),n("h3",{attrs:{id:"_4-1-使用volatile"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-1-使用volatile"}},[t._v("#")]),t._v(" 4.1 使用volatile")]),t._v(" "),n("p",[t._v("volatile关键字解决的是可见性问题:当一个线程修改了某个共享变量的值,其他线程能够立刻看到修改后的值。")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("volatile")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("boolean")]),t._v(" myVar "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("h3",{attrs:{id:"_4-2-使用synchronized"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-2-使用synchronized"}},[t._v("#")]),t._v(" 4.2 使用synchronized")]),t._v(" "),n("p",[t._v("同步代码块")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("synchronized")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("lock"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 业务逻辑")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("p",[t._v("同步方法")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("synchronized")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("myMethod")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 业务逻辑")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("h3",{attrs:{id:"_4-3-使用reentrantlock"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-3-使用reentrantlock"}},[t._v("#")]),t._v(" 4.3 使用ReentrantLock")]),t._v(" "),n("p",[t._v("Lock,JDK5新增的")]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Lock")]),t._v(" lock "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ReentrantLock")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n lock"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("lock")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 业务逻辑")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("finally")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n lock"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("unlock")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("h3",{attrs:{id:"_4-4-几种方式比较"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_4-4-几种方式比较"}},[t._v("#")]),t._v(" 4.4 几种方式比较")]),t._v(" "),n("p",[t._v("volatile关键字解决的是可见性问题:当一个线程修改了某个共享变量的值,其他线程能够立刻看到修改后的值。")]),t._v(" "),n("p",[t._v("synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。")]),t._v(" "),n("p",[t._v("ReentrantLock也是独占锁,加锁和解锁的过程需要手动进行,不易操作,但非常灵活。")]),t._v(" "),n("h2",{attrs:{id:"_5-线程通信的应用"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_5-线程通信的应用"}},[t._v("#")]),t._v(" 5 线程通信的应用")]),t._v(" "),n("p",[n("strong",[t._v("生产者消费者模式")]),t._v(",也叫"),n("strong",[t._v("等待唤醒机制")]),t._v(",是一个非常经典的"),n("strong",[t._v("多线程协作模式")]),t._v("。")]),t._v(" "),n("p",[t._v("一个线程负责生产数据,放到共享区域,然后通知另一个线程去消耗数据。")]),t._v(" "),n("ol",[n("li",[n("p",[n("strong",[t._v("synchronized + wait + notify 实现多线程协调")])]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("synchronized")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InterruptedException")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("条件"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 业务逻辑")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("notify")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("wait")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])])]),t._v(" "),n("li",[n("p",[n("strong",[t._v("Lock + Condition 实现多线程协调")])]),t._v(" "),n("div",{staticClass:"language-java line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-java"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Lock")]),t._v(" lock "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ReentrantLock")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("final")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Condition")]),t._v(" condition "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" lock"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("newCondition")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throws")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("InterruptedException")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n lock"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("lock")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("条件"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 业务逻辑")]),t._v("\n condition"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("signal")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 相当notify")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n condition"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("await")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 相当于wait")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("finally")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n lock"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("unlock")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br")])])])]),t._v(" "),n("blockquote",[n("p",[t._v("Condition提供的await()、signal()、signalAll()原理和synchronized锁对象的wait()、notify()、notifyAll()是一致的,并且其行为也是一样的")])]),t._v(" "),n("h2",{attrs:{id:"_6-扩展知识"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#_6-扩展知识"}},[t._v("#")]),t._v(" 6 扩展知识")]),t._v(" "),n("h3",{attrs:{id:"sleep-和-wait-的区别"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#sleep-和-wait-的区别"}},[t._v("#")]),t._v(" sleep 和 wait 的区别")]),t._v(" "),n("p",[t._v("相同点:")]),t._v(" "),n("ul",[n("li",[t._v("调用sleep或wait,线程都会进入阻塞状态。")])]),t._v(" "),n("p",[t._v("不同点:")]),t._v(" "),n("ol",[n("li",[t._v("声明位置不同:Thread类中声明sleep,Object类中声明wait;")]),t._v(" "),n("li",[t._v("调用位置不同:sleep在任何地方都可以使用,wait只能用在同步代码块或者同步方法中;")]),t._v(" "),n("li",[t._v("关于是否释放同步监听器:如果两个方法都用在同步代码块或者同步方法中,sleep不会释放,wait会释放。")])]),t._v(" "),n("h3",{attrs:{id:"wait、notify、notifyall"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#wait、notify、notifyall"}},[t._v("#")]),t._v(" wait、notify、notifyAll")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("三个方法都是定义在Object类中;")])]),t._v(" "),n("li",[n("p",[t._v("三个方法只能使用在同步代码块或同步方法中;")])]),t._v(" "),n("li",[n("p",[t._v("三个方法的调用者必须是同步代码块或同步方法中的同步监听器;")])]),t._v(" "),n("li",[n("p",[t._v("一旦调用wait方法,线程就会进入阻塞状态,释放同步监听器;")])]),t._v(" "),n("li",[n("p",[t._v("一旦调用notify方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级最高的那个;")])]),t._v(" "),n("li",[n("p",[t._v("一旦调用notifyAll方法,就会唤醒所有被wait的线程。")])])]),t._v(" "),n("h2",{attrs:{id:"参考资料"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#参考资料"}},[t._v("#")]),t._v(" 参考资料")]),t._v(" "),n("p",[n("a",{attrs:{href:"https://www.liaoxuefeng.com/wiki/1252599548343744/1255943750561472",target:"_blank",rel:"noopener noreferrer"}},[t._v("多线程 - 廖雪峰的官网网站"),n("OutboundLink")],1)]),t._v(" "),n("p",[n("a",{attrs:{href:"https://www.bilibili.com/video/BV1Qb411g7cz",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java -Java 学习- Java 基础到高级-宋红康-零基础自学Java-尚硅谷"),n("OutboundLink")],1)]),t._v(" "),n("p",[n("a",{attrs:{href:"https://www.cnblogs.com/wanghaoyang/p/11041303.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java中Atomic类的使用分析"),n("OutboundLink")],1)]),t._v(" "),n("p",[t._v("锁机制")]),t._v(" "),n("p",[t._v("锁升级")]),t._v(" "),n("p",[t._v("偏向锁、轻量级锁、重量级锁")]),t._v(" "),n("p",[t._v("AQS是什么?AQS如何实现可重入锁?")]),t._v(" "),n("p",[t._v("可重入锁")]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("可重入锁,也称递归锁。\n\n可以重复获取相同的锁。\nhttps://blog.csdn.net/w8y56f/article/details/89554060\n\n如果一个线程在执行一个持有锁的方法,在这个方法中调用另一个持有相同锁的方法,则该线程可以直接调用,而无需重新获取锁。\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br")])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/43.21c787fc.js b/assets/js/43.21c787fc.js new file mode 100644 index 00000000..bc92101c --- /dev/null +++ b/assets/js/43.21c787fc.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{622:function(t,a,s){t.exports=s.p+"assets/img/20211126164455.3e515f8a.jpg"},725:function(t,a,s){"use strict";s.r(a);var n=s(7),e=Object(n.a)({},(function(){var t=this,a=t.$createElement,n=t._self._c||a;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("官方资料:")]),t._v(" "),n("p",[n("a",{attrs:{href:"https://mybatis.org/mybatis-3/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://mybatis.org/mybatis-3/index.html"),n("OutboundLink")],1)]),t._v(" "),n("p",[n("a",{attrs:{href:"https://mybatis.org/mybatis-3/zh/index.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://mybatis.org/mybatis-3/zh/index.html"),n("OutboundLink")],1)]),t._v(" "),n("p",[n("a",{attrs:{href:"http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/"),n("OutboundLink")],1)]),t._v(" "),n("p",[t._v("约束文件:")]),t._v(" "),n("p",[n("a",{attrs:{href:"http://mybatis.org/dtd/mybatis-3-config.dtd",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://mybatis.org/dtd/mybatis-3-config.dtd"),n("OutboundLink")],1)]),t._v(" "),n("p",[n("a",{attrs:{href:"http://mybatis.org/dtd/mybatis-3-mapper.dtd",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://mybatis.org/dtd/mybatis-3-mapper.dtd"),n("OutboundLink")],1)]),t._v(" "),n("p",[n("img",{attrs:{src:s(622),alt:""}})]),t._v(" "),n("p",[t._v("mybatis-config.xml")]),t._v(" "),n("div",{staticClass:"language-xml line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-xml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token doctype"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("configuration")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("environments")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("default")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("development"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("environment")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("id")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("development"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("transactionManager")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("JDBC"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dataSource")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("type")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("POOLED"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("driver"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${driver}"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("url"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${url}"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("username"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${username}"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("property")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("name")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("password"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("value")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("${password}"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mappers")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mapper")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("resource")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("org/mybatis/example/BlogMapper.xml"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br")])]),n("p",[t._v("*Mapper.xml")]),t._v(" "),n("div",{staticClass:"language-xml line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-xml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token prolog"}},[t._v('')]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token doctype"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mapper")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("namespace")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[n("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br")])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/44.5274c070.js b/assets/js/44.5274c070.js new file mode 100644 index 00000000..dc40b7af --- /dev/null +++ b/assets/js/44.5274c070.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{648:function(t,s,a){t.exports=a.p+"assets/img/20220203154924.d32369fb.jpg"},744:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h2",{attrs:{id:"vmware"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#vmware"}},[t._v("#")]),t._v(" VMware")]),t._v(" "),n("h3",{attrs:{id:"vmware安装及配置"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#vmware安装及配置"}},[t._v("#")]),t._v(" VMware安装及配置")]),t._v(" "),n("p",[t._v("点击"),n("a",{attrs:{href:"https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("下载 VMware Workstation Pro | CN"),n("OutboundLink")],1),t._v(",下载完成后安装VMware。")]),t._v(" "),n("p",[t._v("如果是最小化安装,则需要安装以下工具:")]),t._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[t._v("yum "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y net-tools\nyum "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("vim")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[t._v("如果虚拟机无法ping通宿主机,在控制面板-系统和安全-Windows Defender 防火墙,点击高级设置,选择入站规则,把虚拟机监控(回显请求-ICMPv4-In)的规则启用即可。")]),t._v(" "),n("p",[n("img",{attrs:{src:a(648),alt:""}})]),t._v(" "),n("p",[t._v("VMware提供了三种网络工作模式:桥接模式(Bridged)、网络地址转换模式(NAT)、仅主机模式(Host-Only)。")]),t._v(" "),n("ul",[n("li",[n("strong",[t._v("桥接模式(Bridged)")]),t._v(":\n"),n("ul",[n("li",[t._v("在这种模式下,虚拟机的网络配置与物理机处于同一网段,虚拟机可以直接访问物理机的网络资源,反之亦然。")]),t._v(" "),n("li",[t._v("虚拟机与物理机之间的通信类似于它们连接到一个交换机上,可以实现相互访问而不干扰。")]),t._v(" "),n("li",[t._v("虚拟机的IP地址需要与物理机在同一个网段内,如果虚拟机需要联网,则网关与DNS需要与物理机的网卡保持一致。")]),t._v(" "),n("li",[t._v("桥接模式的优点是提供了最大的灵活性和网络访问权限,但缺点是可能会消耗更多的IP资源,如果网络环境对IP管理比较严格,则不太适用。")])])]),t._v(" "),n("li",[n("strong",[t._v("网络地址转换模式(NAT)")]),t._v(":\n"),n("ul",[n("li",[t._v("NAT模式允许虚拟机通过物理机的网卡访问外部网络,同时保护虚拟机的IP地址不被外部网络直接访问。")]),t._v(" "),n("li",[t._v("在这种模式下,虚拟机通过物理机的NAT功能进行网络地址转换,实现与外部网络的通信。")]),t._v(" "),n("li",[t._v("NAT模式的优点是节省IP资源,适用于网络环境对IP管理较严格的情况,缺点是虚拟机的网络访问可能受到一定的限制。")])])]),t._v(" "),n("li",[n("strong",[t._v("仅主机模式(Host-Only)")]),t._v(":\n"),n("ul",[n("li",[t._v("仅主机模式创建了一个封闭的虚拟网络,其中只包含主机和虚拟机之间的通信。")]),t._v(" "),n("li",[t._v("在这种模式下,虚拟机只能与主机进行通信,无法访问外部网络。")]),t._v(" "),n("li",[t._v("适用于需要隔离虚拟机与外部网络的场景,例如内部测试或开发环境。")])])])]),t._v(" "),n("h3",{attrs:{id:"centos7安装及配置"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#centos7安装及配置"}},[t._v("#")]),t._v(" Centos7安装及配置")]),t._v(" "),n("p",[t._v("点击查看"),n("a",{attrs:{href:"https://www.runoob.com/w3cnote/vmware-install-centos7.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("VMware安装Centos7超详细过程"),n("OutboundLink")],1),t._v("。")]),t._v(" "),n("p",[t._v("在CentOS 7系统中,网络设置涉及多个方面,包括网络模式选择、静态IP配置、动态IP配置(使用DHCP)、以及网络服务的重启和验证。以下是一些关键步骤和考虑因素:")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("网络模式选择:VMware支持三种虚拟机网络模式:桥接模式、网络地址转换模式、仅主机模式。每种模式都有其特定的用途和限制。例如,桥接模式允许虚拟机与宿主机在同一网段内,可以访问外部网络;网络地址转换模式则通过虚拟机的NAT功能访问外部网络,但无法直接访问局域网内的其他机器。")])]),t._v(" "),n("li",[n("p",[t._v("静态IP配置:若要为CentOS 7系统分配一个固定的IP地址,需要编辑网络配置文件"),n("code",[t._v("/etc/sysconfig/network-scripts/ifcfg-")]),t._v(",其中是网络接口名称。在文件中添加或修改以下配置信息:")]),t._v(" "),n("div",{staticClass:"language-properties line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-properties"}},[n("code",[n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("DEVICE")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("\t\t# 网卡名称")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("TYPE")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v('"Ethernet" \t\t\t# 网卡类型-以太网卡')]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ONBOOT")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v('"yes"\t\t\t\t# 是否启动该网卡,CentOS系统安装后默认是no,需要改成yes')]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("BOOTPROTO")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v('"static"\t\t\t# 获取IP地址的方式,默认是DHCP服务器分配,如果需要手动设置,改为none或static')]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("IPADDR")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("NETMASK")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("GATEWAY")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("DNS1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("DNS2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("p",[t._v("保存文件后,重启网络服务以应用新的网络配置。")])]),t._v(" "),n("li",[n("p",[t._v("动态IP配置(使用DHCP):若要使用DHCP自动获取IP地址,编辑相同的网络配置文件,并删除或注释掉IPADDR、NETMASK和GATEWAY行,确保它们不再生效。保存文件后,重启网络服务以应用新的网络配置。")])]),t._v(" "),n("li",[n("p",[t._v("重启网络服务:完成配置后,需要重启网络服务以使更改生效。可以使用命令"),n("code",[t._v("systemctl restart network")]),t._v("或"),n("code",[t._v("service network restart")]),t._v("来重启网络服务。")])]),t._v(" "),n("li",[n("p",[t._v("验证网络连接:完成配置和重启后,应使用ping命令检查网络连接。例如,ping网关IP地址或尝试访问外部网站以验证网络连接是否正常。")])])]),t._v(" "),n("p",[t._v("如果想让系统有一个可以上网的IP地址,但又没有DHCP服务器分配,就需要手动静态配置IP地址。在Linux中分为临时配置和永久配置,临时配置是指重启后就恢复原来的设置,一般作为调试故障用。永久配置在命令提示符之后输入:")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 首先使用 ifconfig 命令查看IP地址,确定网卡名称(网络接口名称)")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 然后使用 /etc/sysconfig/network-scripts/ifcfg- 命令修改网卡配置")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("vim")]),t._v(" /etc/sysconfig/network-scripts/ifcfg-ens33\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("p",[t._v("在文件中添加或修改以下配置信息:")]),t._v(" "),n("div",{staticClass:"language-properties line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-properties"}},[n("code",[n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("NAME")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v('"ens33" \t\t\t# 网卡名称')]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("DEVICE")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v('"ens33" \t\t\t# 网卡名称')]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("TYPE")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v('"Ethernet" \t\t# 网卡类型-以太网卡')]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("ONBOOT")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v('"yes"\t\t\t# 是否启动该网卡,CentOS系统安装后默认是no,需要改成yes')]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("BOOTPROTO")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v('"static"\t\t# 获取IP地址的方式,默认是DHCP服务器分配,如果需要手动设置,改为none或static')]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("IPADDR")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("192.168.1.10\t\t# 需要设置的IP地址")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("GATEWAY")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("192.168.1.1")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("NETMASK")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("255.255.255.0")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("DNS1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("114.114.114.114")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("DNS2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("8.8.8.8")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br")])]),n("p",[t._v("永久修改主机名")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("hostnamectl set-hostname new_hostname\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[t._v("编辑 /etc/hosts 文件,将127.0.0.1行的主机名修改为新主机名")]),t._v(" "),n("p",[t._v("编辑 /etc/profile 文件, 添加参数 "),n("code",[t._v('export PS1="[\\u@\\H \\W]\\$"')]),t._v(" , 执行 "),n("code",[t._v("source !$")]),t._v(" 命令使参数立即生效,解决主机名显示不全的问题。")]),t._v(" "),n("p",[t._v("重启服务器")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("reboot")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[t._v("检查IP和主机名")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 检查主机名")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("hostname")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ifconfig")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 显示网卡IP信息")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ip")]),t._v(" addr show\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 显示网卡IP信息")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 验证网络连接")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ping")]),t._v(" baidu.com\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ping")]),t._v(" 宿主机IP\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("h3",{attrs:{id:"ubuntu18安装及配置"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ubuntu18安装及配置"}},[t._v("#")]),t._v(" Ubuntu18安装及配置")]),t._v(" "),n("p",[n("a",{attrs:{href:"https://releases.ubuntu.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://releases.ubuntu.com/"),n("OutboundLink")],1)]),t._v(" "),n("p",[n("a",{attrs:{href:"https://packages.ubuntu.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://packages.ubuntu.com/"),n("OutboundLink")],1)]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -y vim*\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[t._v("修改网卡配置 "),n("code",[t._v("vim /etc/network/interfaces")]),t._v(" 手动静态配置IP地址,在文件中添加或修改以下配置信息:")]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("# interfaces(5) file used by ifup(8) and ifdown(8)\nauto lo\niface lo inet loopback\n\nauto ens33\niface ens33 inet static\naddress 192.168.1.29\nnetmask 255.255.255.0\ngateway 192.168.1.1\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("p",[t._v("修改DNS配置文件 "),n("code",[t._v("vim /etc/systemd/resolved.conf")]),t._v(" ,解决ping baidu.com不通")]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("[Resolve]\nDNS=8.8.8.8 114.114.114.114\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[t._v("重启域名解析服务")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("systemctl restart systemd-resolved\nsystemctl "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" systemd-resolved\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("h2",{attrs:{id:"linux-常用命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#linux-常用命令"}},[t._v("#")]),t._v(" Linux 常用命令")]),t._v(" "),n("p",[n("a",{attrs:{href:"https://www.runoob.com/linux/linux-command-manual.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.runoob.com/linux/linux-command-manual.html"),n("OutboundLink")],1)]),t._v(" "),n("p",[t._v("Linux基本命令格式如下:")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("command")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("options"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" arguments\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[t._v("可以使用 "),n("code",[t._v("command --help")]),t._v(" 或者 "),n("code",[t._v("man command")]),t._v(" 查看 options、arguments 的用法,例如:")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ls")]),t._v(" --help\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("man")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ls")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[t._v("注意:CentOS最小化安装默认没有安装man手册,如果需要使用man手册,必须安装man-pages这个包。")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("yum "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" man-pages\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("h3",{attrs:{id:"帮助命令"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#帮助命令"}},[t._v("#")]),t._v(" 帮助命令")]),t._v(" "),n("p",[t._v("通过man获取某条指令的使用手册,如:")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("man")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ls")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[t._v("man常用键及用途")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",{staticStyle:{"text-align":"left"}},[t._v("按键")]),t._v(" "),n("th",{staticStyle:{"text-align":"left"}},[t._v("用途")])])]),t._v(" "),n("tbody",[n("tr",[n("td",{staticStyle:{"text-align":"left"}},[t._v("Space")]),t._v(" "),n("td",{staticStyle:{"text-align":"left"}},[t._v("向下翻页")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[t._v("PgDn")]),t._v(" "),n("td",{staticStyle:{"text-align":"left"}},[t._v("向下一行")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[t._v("PgUp")]),t._v(" "),n("td",{staticStyle:{"text-align":"left"}},[t._v("向上一行")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[t._v("/")]),t._v(" "),n("td",{staticStyle:{"text-align":"left"}},[t._v("从上至下搜索某个关键词,如“/linux”")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[t._v("?")]),t._v(" "),n("td",{staticStyle:{"text-align":"left"}},[t._v("从下至上搜索某个关键词,如“?linux”")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[t._v("n")]),t._v(" "),n("td",{staticStyle:{"text-align":"left"}},[t._v("定位到下一个搜索到的关键词")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[t._v("N")]),t._v(" "),n("td",{staticStyle:{"text-align":"left"}},[t._v("定位到上一个搜索到的关键词")])]),t._v(" "),n("tr",[n("td",{staticStyle:{"text-align":"left"}},[t._v("q")]),t._v(" "),n("td",{staticStyle:{"text-align":"left"}},[t._v("退出帮助文档")])])])]),t._v(" "),n("h3",{attrs:{id:"ip-主机名-域名"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#ip-主机名-域名"}},[t._v("#")]),t._v(" IP/主机名/域名")]),t._v(" "),n("p",[t._v("Linux "),n("a",{attrs:{href:"https://www.runoob.com/linux/linux-comm-ifconfig.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("ifconfig"),n("OutboundLink")],1),t._v("命令用于显示或设置网络设备。")]),t._v(" "),n("p",[t._v("ifconfig可设置网络设备的状态,或是显示目前的设置。")]),t._v(" "),n("p",[t._v("Linux "),n("a",{attrs:{href:"https://www.runoob.com/linux/linux-comm-ip.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("ip"),n("OutboundLink")],1),t._v(" 命令与 "),n("a",{attrs:{href:"https://www.runoob.com/linux/linux-comm-ifconfig.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("ifconfig"),n("OutboundLink")],1),t._v(" 命令类似,但比 ifconfig 命令更加强大,主要功能是用于显示或设置网络设备。")]),t._v(" "),n("p",[t._v("ip 命令是 Linux 加强版的的网络配置工具,用于代替 ifconfig 命令。")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ifconfig")]),t._v("\t\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 显示网卡IP信息")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ip")]),t._v(" addr show\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 显示网卡IP信息")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 给eth0网卡配置IP地址")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ifconfig")]),t._v(" eth0 "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".1.56\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 给eth0网卡配置IP地址,并加上子掩码")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ifconfig")]),t._v(" eth0 "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".1.56 netmask "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("255.255")]),t._v(".255.0 \n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 给eth0网卡配置IP地址,加上子掩码,加上个广播地址")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ifconfig")]),t._v(" eth0 "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".1.56 netmask "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("255.255")]),t._v(".255.0 broadcast "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".1.255\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("p",[t._v("使用 "),n("code",[t._v("hostname")]),t._v(" 命令或者 "),n("code",[t._v("cat /etc/hostname")]),t._v(" 命令查看当前主机名")]),t._v(" "),n("p",[t._v("使用 "),n("code",[t._v("hostname new_hostname")]),t._v(" 命令临时更改主机名,仅当前会话期间有效(下次重启会恢复原主机名)")]),t._v(" "),n("p",[t._v("使用 "),n("code",[t._v("hostnamectl set-hostname new_hostname")]),t._v(" 命令或者 "),n("code",[t._v("vim /etc/hostname")]),t._v(" 永久更改主机名")]),t._v(" "),n("p",[t._v("编辑 /etc/hostname 文件,将原有的主机名替换成新主机名即可")]),t._v(" "),n("p",[t._v("编辑 /etc/hosts 文件,将127.0.0.1行的主机名修改为新主机名即可")]),t._v(" "),n("h3",{attrs:{id:"防火墙"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#防火墙"}},[t._v("#")]),t._v(" 防火墙")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 查看防火墙状态")]),t._v("\nsystemctl status firewalld\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 开启防火墙")]),t._v("\nsystemctl start firewalld\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 暂时关闭防火墙")]),t._v("\nsystemctl stop firewalld\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 永久关闭防火墙")]),t._v("\nsystemctl disable firewalld\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 重启防火墙")]),t._v("\nsystemctl "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" firewalld\nsystemctl restart firewalld\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 查看已经开放的端口号")]),t._v("\nfirewall-cmd --list-all\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 查看指定端口号是否已经开放")]),t._v("\nfirewall-cmd --query-port"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("端口号/tcp\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 开放指定端口号")]),t._v("\nfirewall-cmd --permanent --add-port"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("端口号/tcp\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 关闭指定端口号")]),t._v("\nfirewall-cmd --permanent --remove-port"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("端口号/tcp\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 重新载入配置")]),t._v("\nfirewall-cmd --reload\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br")])]),n("h3",{attrs:{id:"磁盘管理"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#磁盘管理"}},[t._v("#")]),t._v(" 磁盘管理")]),t._v(" "),n("h4",{attrs:{id:"df"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#df"}},[t._v("#")]),t._v(" df")]),t._v(" "),n("p",[t._v("df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。")]),t._v(" "),n("p",[t._v("语法:")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("df")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("选项"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(". "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("FILE"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[t._v("选项:")]),t._v(" "),n("p",[t._v("-l, --local:仅显示本地文件系统。")]),t._v(" "),n("p",[t._v("-h, --human-readable:以人类可读的格式显示输出结果。")]),t._v(" "),n("h2",{attrs:{id:"linux-配置文件"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#linux-配置文件"}},[t._v("#")]),t._v(" Linux 配置文件")]),t._v(" "),n("h3",{attrs:{id:"etc-hosts"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#etc-hosts"}},[t._v("#")]),t._v(" /etc/hosts")]),t._v(" "),n("p",[t._v("/etc/hosts:主机名查询静态表,是ip地址与域名快速解析的文件。ip地址与主机名之间的映射,包括主机的别名。")]),t._v(" "),n("p",[t._v("通常将常用的域名和ip地址映射加入到hosts文件中,实现快速方便的访问。")]),t._v(" "),n("p",[t._v("如果没有域名解析(DNS),操作系统需要查询该文件来解析对应主机名的ip地址;")]),t._v(" "),n("p",[t._v("如果有域名解析(DNS),也可以设置该文件,优先级为: DNS缓存 > /etc/hosts > DNS服务。")]),t._v(" "),n("p",[t._v("文件格式解析:")]),t._v(" "),n("div",{staticClass:"language- line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("IP  主机名 域名 主机别名(一个IP有多个名字,可用空格隔离)\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[t._v("主机名:通常在局域网内使用,通过hosts文件,主机名被解析到对应的ip")]),t._v(" "),n("p",[t._v("域名:通常在互联网上使用,但是优先级低于hosts文件中内容,因此如果你不想使用互联网上的域名解析,可以更改自己的hosts文件,加入自己的域名解析")]),t._v(" "),n("h2",{attrs:{id:"linux-安装目录"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#linux-安装目录"}},[t._v("#")]),t._v(" Linux 安装目录")]),t._v(" "),n("p",[t._v("在Linux系统中,第三方软件通常安装在 /usr/local、/opt 或者用户的家目录下的 local 或 application 文件夹中。以下是一些常见的第三方软件安装路径:")]),t._v(" "),n("ol",[n("li",[n("p",[t._v("/usr/local:通常用于安装手动编译的软件或者用户自行编译的软件包。")])]),t._v(" "),n("li",[n("p",[t._v("/opt:用于安装额外的软件包,这些软件包可能存在于非标准位置,且可能需要额外的配置才能使用。")])]),t._v(" "),n("li",[n("p",[t._v("用户家目录下的 local 或 application 文件夹:用于安装用户级别的第三方软件,不需要特定权限即可安装和使用。")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/45.01e1bbef.js b/assets/js/45.01e1bbef.js new file mode 100644 index 00000000..791b38d5 --- /dev/null +++ b/assets/js/45.01e1bbef.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{628:function(s,a,n){s.exports=n.p+"assets/img/20240623132314.a4c803f0.jpg"},731:function(s,a,n){"use strict";n.r(a);var t=n(7),e=Object(t.a)({},(function(){var s=this,a=s.$createElement,t=s._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h2",{attrs:{id:"源码安装"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#源码安装"}},[s._v("#")]),s._v(" 源码安装")]),s._v(" "),t("h3",{attrs:{id:"configure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configure"}},[s._v("#")]),s._v(" configure")]),s._v(" "),t("p",[s._v("configure是一个在编译软件源代码之前运行的脚本,用于检查系统中的环境变量、编译器和其他依赖项,并生成适合当前系统的Makefile文件。")]),s._v(" "),t("p",[s._v("以下是一些常用的configure参数及其说明:")]),s._v(" "),t("ul",[t("li",[t("p",[s._v("--build:指定编译该软件所使用的平台,即当前运行configure脚本的机器类型。例如,如果在Intel Pentium机器上编译,该参数可能是i686-pc-linux-gnu。")])]),s._v(" "),t("li",[t("p",[s._v("--host:指定软件将运行的平台,即生成的程序将运行在什么平台上。在交叉编译过程中,这个参数需要明确指定,因为它决定了编译好的程序在哪个平台上运行。")])]),s._v(" "),t("li",[t("p",[s._v("--target:指定软件所处理的目标平台,这在建立交叉编译环境时特别重要。它表示使用build主机上的编译器编译一个新的编译器(如binutils, gcc, gdb等),以便编译出的程序能在target指定的系统上运行。")])]),s._v(" "),t("li",[t("p",[s._v("CC:指定C编译器命令,如果不配置则默认为host对应的GCC工具。例如,如果配置了--host=arm-xilinx-linux-gnueabi,则默认CC的编译器为arm-xilinx-linux-gnueabi-gcc。")])]),s._v(" "),t("li",[t("p",[s._v("--prefix:指定编译后文件安装的目录。如果不指定prefix,则可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc。")])]),s._v(" "),t("li",[t("p",[s._v("--sysconfdir:用于指定配置文件的安装目录。默认情况下,配置文件通常会被安装到 /etc 目录下。如果你想要将配置文件安装到其他目录,可以使用 --sysconfdir 参数来指定这个目录。")])]),s._v(" "),t("li",[t("p",[s._v("--disable-FEATURE 和 --enable-FEATURE[=ARG]:这些选项用于在编译时配置软件包的功能。--disable-FEATURE用于禁用某些默认提供的特性,而--enable-FEATURE[=ARG]用于启用这些特性,其中FEATURE是特性的名字。例如,可以使用--disable-gui来禁用图形用户界面功能。")])]),s._v(" "),t("li",[t("p",[s._v("--with-PACKAGE[=ARG] 和 --without-PACKAGE:这些选项用于指定软件包依赖的其他已安装的软件包和库。例如,当配置依赖于Tcl和Tk的BLT器件工具包时,可能需要提供关于Tcl和Tk安装位置的信息。使用--without-PACKAGE可以禁止软件包与系统已有的软件包交互。")])])]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /usr/local/src/your_package\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置安装信息及检测安装环境")]),s._v("\n./configure --prefix"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/usr/local/your_package\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 编译")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 如果make出现错误,使用make clean清除编译文件")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# make clean")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 卸载:直接删除安装目录")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br")])]),t("h2",{attrs:{id:"二进制安装"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#二进制安装"}},[s._v("#")]),s._v(" 二进制安装")]),s._v(" "),t("h3",{attrs:{id:"rpm"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rpm"}},[s._v("#")]),s._v(" rpm")]),s._v(" "),t("p",[s._v("rpm(redhat package manager) 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项套件的程序,由于它遵循 GPL 规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM 套件管理方式的出现,让 Linux 易于安装,升级,间接提升了 Linux 的适用度。")]),s._v(" "),t("p",[s._v("rpm包文件名含义")]),s._v(" "),t("p",[t("img",{attrs:{src:n(628),alt:""}})]),s._v(" "),t("p",[s._v("rpm语法:")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("options"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("package "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("常用选项:")]),s._v(" "),t("ul",[t("li",[s._v("-i install 表示安装")]),s._v(" "),t("li",[s._v("-v verbose 表示输出详细信息")]),s._v(" "),t("li",[s._v("-h hase 表示显示进度条")])]),s._v(" "),t("p",[s._v("常用命令:")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装 i(install安装) v(verbose显示详细信息) h(hase显示进度)")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -ivh 包全名\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 升级 U(upgrade升级)")]),s._v("\nrmp -Uvh 包全名\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 卸载 e(erase)")]),s._v("\nrmp -e 包名\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询已安装的软件包列表")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -qa\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询一个包是否被安装")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -qa "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" package_keyword\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询 q(query) a(all)")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询是否已安装某软件包")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -q 包名\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询已安装软件包的位置")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -ql 包名\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询已安装软件包的信息")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -qi 包名\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br")])]),t("h3",{attrs:{id:"yum"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#yum"}},[s._v("#")]),s._v(" yum")]),s._v(" "),t("p",[s._v("yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端软件包管理器。")]),s._v(" "),t("p",[s._v("基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。")]),s._v(" "),t("p",[s._v("yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令。")]),s._v(" "),t("p",[s._v("yum 语法:")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("yum "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("options"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("package "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("ul",[t("li",[s._v('options:可选,选项包括-h(帮助),-y(当安装过程提示选择全部为 "yes"),-q(不显示安装的过程)等等。')]),s._v(" "),t("li",[s._v("command:要进行的操作。")]),s._v(" "),t("li",[s._v("package:安装的包名。")])]),s._v(" "),t("p",[s._v("yum常用命令:")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 仅安装指定的软件命令")]),s._v("\nyum "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("package_name"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 仅更新指定的软件命令")]),s._v("\nyum update "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("package_name"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除软件包命令")]),s._v("\nyum remove "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("package_name"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查找软件包命令")]),s._v("\nyum search "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("keyword"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Enabling a Yum Repository")]),s._v("\nyum-config-manager --enable repository\nyum-config-manager --enable glob_expression\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Disabling a Yum Repository")]),s._v("\nyum-config-manager --disable repository\nyum-config-manager --disable glob_expression\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br")])]),t("p",[s._v("使用 yum install 命令在线安装 Linux系统的软件,这种方式可以自动处理依赖性关系,并且一次安装所有依赖的软件包。从国外下载软件速度非常慢,很多情况下都无法下载。国内一些大公司做镜像同步国外的软件,我们可以使用国内的下载地址,下载需要的软件。yum源就是yum命令获取rpm包的地方。也被称作yum仓库。")]),s._v(" "),t("p",[s._v("yum的配置文件有两种,一个是主配置文件(/etc/yum.conf),一个是各个仓库的配置文件,在/etc/yum.repos.d/目录下。主配置文件里面的配置针对各个仓库的配置文件(/etc/yum.repos.d/)都生效,各个仓库的配置文件里面的配置可以覆盖主配置文件,也就是说优先级比主配置文件yum.conf高。")]),s._v(" "),t("p",[s._v("国内yum源镜像站:")]),s._v(" "),t("p",[s._v("清华大学:"),t("a",{attrs:{href:"https://mirrors.tuna.tsinghua.edu.cn/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://mirrors.tuna.tsinghua.edu.cn/"),t("OutboundLink")],1)]),s._v(" "),t("p",[s._v("阿里云 :"),t("a",{attrs:{href:"https://developer.aliyun.com/mirror/centos",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://developer.aliyun.com/mirror/centos"),t("OutboundLink")],1)]),s._v(" "),t("p",[s._v("中科大 :"),t("a",{attrs:{href:"https://mirrors.ustc.edu.cn/help/centos.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://mirrors.ustc.edu.cn/help/centos.html"),t("OutboundLink")],1)]),s._v(" "),t("p",[s._v("浙大:"),t("a",{attrs:{href:"https://mirrors.zju.edu.cn/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://mirrors.zju.edu.cn/"),t("OutboundLink")],1)]),s._v(" "),t("p",[s._v("网易:"),t("a",{attrs:{href:"http://mirrors.163.com/.help/centos.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("http://mirrors.163.com/.help/centos.html"),t("OutboundLink")],1)]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看主配置文件")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" /etc/yum.conf\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 列出所有仓库配置文件")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ls")]),s._v(" -l /etc/yum.repos.d\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 备份")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("mv")]),s._v(" /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# yum -y install wget")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("wget")]),s._v(" -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 升级所有软件包")]),s._v("\nyum -y update\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# epel-release的主要用途是提供一个额外的软件源,用于安装那些在官方软件源中不可用或难以找到的软件包。EPEL(Extra Packages for Enterprise Linux)是一个由Fedora社区创建的项目,旨在为RHEL(Red Hat Enterprise Linux)及其衍生版本(如CentOS、Scientific Linux等)提供高质量的软件包。通过安装epel-release软件包,用户实际上是在他们的系统中添加了一个第三方的yum源,这个源提供了比官方rpm仓库更丰富的软件包资源。这在官方源中软件包不足或缺少某些特定软件时非常有用,避免了用户自行编译软件的繁琐过程。")]),s._v("\nyum -y "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" epel-release\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 运行 yum makecache 生成缓存")]),s._v("\nyum clean all\nyum makecache\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 列出所有启用的源, 等同于yum repolist enabled")]),s._v("\nyum repolist\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 列出所有禁用的源")]),s._v("\nyum repolist disabled\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 列出启用(禁用)源的更详细信息")]),s._v("\nyum repoinfo "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("enabled"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("disabled"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 从指定源安装/搜索软件;“–disablerepo”和”–enablerepo”选项可独立或配合使用,动态启用和禁用源。")]),s._v("\nyum --disablerepo"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"*"')]),s._v(" --enablerepo"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"xxxx"')]),s._v(" install/search\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br")])]),t("p",[s._v("YUM configuration basics")]),s._v(" "),t("p",[s._v("Yum configuration has repositories defined. Repositories are the places where package files "),t("code",[s._v(".rpm")]),s._v(" are located and yum searches, downloads files from repositories for installations. Repositories can be the local mount point file://path, remote FTP location "),t("code",[s._v("ftp://link")]),s._v(", HTTP location link "),t("code",[s._v("http://link")]),s._v(" or "),t("code",[s._v("http://login:password@link")]),s._v(", https link or remote NFS mount point.")]),s._v(" "),t("p",[s._v("Yum configuration file is "),t("code",[s._v("/etc/yum.conf")]),s._v(" and repository configuration files are located under "),t("code",[s._v("/etc/yum.repos.d/")]),s._v(" directory. All repository configuration files must have "),t("code",[s._v(".repo")]),s._v(" extension so than yum can identify them and read their configurations.")]),s._v(" "),t("p",[s._v("The following is a bare-minimum example of the form a "),t("code",[s._v("[*repository*]")]),s._v(" section takes:")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("repository"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("name")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("repository_name\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("baseurl")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("repository_url\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("Typical repo configuration file entry looks like below :")]),s._v(" "),t("div",{staticClass:"language-properties line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-properties"}},[t("code",[s._v("[rhel-source-beta]\n"),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("name")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("Red Hat Enterprise Linux $releasever Beta - $basearch - Source")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("baseurl")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("ftp://ftp.redhat.com/pub/redhat/linux/beta/$releasever/en/os/SRPMS/")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("enabled")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("0")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("gpgcheck")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("1")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("gpgkey")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-beta,file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("ul",[t("li",[t("code",[s._v("[rhrl-source-beta]")]),s._v(" is a unique repository id.")]),s._v(" "),t("li",[t("code",[s._v("name")]),s._v(" is a human readable repository name")]),s._v(" "),t("li",[t("code",[s._v("baseurl")]),s._v(" is the location from where packages should be scanned and fetched")]),s._v(" "),t("li",[t("code",[s._v("enabled")]),s._v(" denotes if this repo is enabled or not i.e. yum should use it or not")]),s._v(" "),t("li",[t("code",[s._v("gpgcheck")]),s._v(" enable/disable GPG signature check")]),s._v(" "),t("li",[t("code",[s._v("gpgkey")]),s._v(" is the location of GPG key")])]),s._v(" "),t("p",[s._v("Out of these first 4 entries are mandatory for every repo location.")]),s._v(" "),t("p",[s._v("More details refer to "),t("a",{attrs:{href:"https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/sec-configuring_yum_and_yum_repositories",target:"_blank",rel:"noopener noreferrer"}},[s._v("Configuring Yum and Yum Repositories"),t("OutboundLink")],1)]),s._v(" "),t("h3",{attrs:{id:"apt"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#apt"}},[s._v("#")]),s._v(" apt")]),s._v(" "),t("p",[s._v("apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。")]),s._v(" "),t("p",[s._v("apt 命令提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。")]),s._v(" "),t("p",[s._v("apt 命令执行需要超级管理员权限(root)。")]),s._v(" "),t("p",[s._v("apt 语法:")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("options"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("package "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("ul",[t("li",[s._v('options:可选,选项包括 -h(帮助),-y(当安装过程提示选择全部为"yes"),-q(不显示安装的过程)等等。')]),s._v(" "),t("li",[s._v("command:要进行的操作。")]),s._v(" "),t("li",[s._v("package:安装的包名。")])]),s._v(" "),t("p",[s._v("apt 常用命令:")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装指定软件")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("package_name"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装多个软件")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("package_"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("1")]),s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("package_"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("2")]),s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("package_"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("3")]),s._v(">")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 更新指定软件")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt")]),s._v(" update "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("package_name"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除指定软件")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt")]),s._v(" remove "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("package_name"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查找指定软件")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt")]),s._v(" search "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("keyword"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br")])]),t("h2",{attrs:{id:"打包、压缩和解压"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#打包、压缩和解压"}},[s._v("#")]),s._v(" 打包、压缩和解压")]),s._v(" "),t("p",[s._v("打包:将一堆文件或一个目录变成一个文件;")]),s._v(" "),t("p",[s._v("压缩:将一个大文件通过压缩算法变成一个小文件。")]),s._v(" "),t("h3",{attrs:{id:"tar"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tar"}},[s._v("#")]),s._v(" tar")]),s._v(" "),t("p",[s._v("tar,可以将目录打包成一个文件。常用选项如下:")]),s._v(" "),t("ul",[t("li",[s._v("-c 建立新的备份文件")]),s._v(" "),t("li",[s._v("-x 从备份文件中还原文件")]),s._v(" "),t("li",[s._v("-f 指定备份文件")]),s._v(" "),t("li",[s._v("-v 显示操作过程")]),s._v(" "),t("li",[s._v("-z 通过gzip指令处理备份文件")]),s._v(" "),t("li",[s._v("-j 支持bzip2解压文件")])]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 仅打包,不压缩")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -cvf test.tar "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 打包后,以 gzip 压缩")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -zcvf test.tar.gz "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 打包后,以 bzip2 压缩")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -jcvf test.tar.bz2 "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("test")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解压 *.tar")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -xvf test.tar\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解压 *.tar.gz")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -zxvf test.tar.gz\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解压 *.tar.gz")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -jxvf test.tar.bz2\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br")])]),t("h3",{attrs:{id:"zip-unzip"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#zip-unzip"}},[s._v("#")]),s._v(" zip, unzip")]),s._v(" "),t("p",[s._v("zip,压缩比率不如gzip")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("-bash: zip: "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("command")]),s._v(" not found\nyum "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("zip")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("unzip")]),s._v(" -y\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("zip")]),s._v(" 压缩后的文件名 文件\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("zip")]),s._v(" -r 压缩后的文件名 目录 "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -r 递归处理,将指定目录下的所有文件和子目录一并处理。")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("unzip")]),s._v(" 解压文件\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br")])]),t("h3",{attrs:{id:"gzip-gunzip"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#gzip-gunzip"}},[s._v("#")]),s._v(" gzip, gunzip")]),s._v(" "),t("p",[s._v("gzip,压缩后文件格式:.gz,"),t("strong",[s._v(",只能压缩文件,不能压缩目录,不保留原文件")])]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("gzip")]),s._v(" 文件\ngunzip 文件\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("h3",{attrs:{id:"bzip2-bunzip2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bzip2-bunzip2"}},[s._v("#")]),s._v(" bzip2, bunzip2")]),s._v(" "),t("p",[s._v("bzip2,gzip的升级版")]),s._v(" "),t("p",[s._v("bzip2,压缩后文件格式:.bz2")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("bzip2")]),s._v(" 文件\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("bzip2")]),s._v(" -k 文件 "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -k 产生压缩文件的同时保留原文件")]),s._v("\n\nbunzip2 文件\nbunzip2 -k 文件 "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -k 解压的同时保留原文件")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/46.4bb863fa.js b/assets/js/46.4bb863fa.js new file mode 100644 index 00000000..6ce4fcab --- /dev/null +++ b/assets/js/46.4bb863fa.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{629:function(t,s,a){t.exports=a.p+"assets/img/20240718223749.0ec49c75.jpg"},735:function(t,s,a){"use strict";a.r(s);var e=a(7),n=Object(e.a)({},(function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h2",{attrs:{id:"shell-脚本"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#shell-脚本"}},[t._v("#")]),t._v(" Shell 脚本")]),t._v(" "),e("p",[t._v("Shell 脚本的第一行一般是:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token shebang important"}},[t._v("#!/bin/bash")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。")]),t._v(" "),e("p",[t._v("Linux 的 Shell 种类众多,常见的有:")]),t._v(" "),e("ul",[e("li",[t._v("Bourne Shell(/usr/bin/sh或/bin/sh)")]),t._v(" "),e("li",[t._v("Bourne Again Shell(/bin/bash)")]),t._v(" "),e("li",[t._v("C Shell(/usr/bin/csh)")]),t._v(" "),e("li",[t._v("K Shell(/usr/bin/ksh)")]),t._v(" "),e("li",[t._v("Shell for Root(/sbin/sh)")]),t._v(" "),e("li",[t._v("……")])]),t._v(" "),e("h2",{attrs:{id:"运行-shell-脚本的两种方法"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#运行-shell-脚本的两种方法"}},[t._v("#")]),t._v(" 运行 Shell 脚本的两种方法")]),t._v(" "),e("h3",{attrs:{id:"作为可执行程序"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#作为可执行程序"}},[t._v("#")]),t._v(" 作为可执行程序")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" +x ./test.sh "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 使脚本具有执行权限")]),t._v("\n./test.sh "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 执行脚本")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("p",[t._v("注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。")]),t._v(" "),e("h3",{attrs:{id:"作为解释器参数"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#作为解释器参数"}},[t._v("#")]),t._v(" 作为解释器参数")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[t._v("/bin/sh ./test.sh "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 执行脚本")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sh")]),t._v(" ./test.sh "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 执行脚本")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("p",[e("img",{attrs:{src:a(629),alt:""}})]),t._v(" "),e("h2",{attrs:{id:"shell-变量"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#shell-变量"}},[t._v("#")]),t._v(" Shell 变量")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://www.runoob.com/linux/linux-shell-passing-arguments.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.runoob.com/linux/linux-shell-passing-arguments.html"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("Shell 变量名只能包含字母、数字和下划线,不能以数字开头。")]),t._v(" "),e("p",[t._v("变量名与等号之间不能有空格。等号两侧避免使用空格:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 正确的赋值")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("variable_name")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("value\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 有可能会导致错误")]),t._v("\nvariable_name "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" value\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br")])]),e("p",[t._v("使用一个定义过的变量,只要在变量名前面加美元符号即可,如:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$variable_name")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${variable_name}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("p",[t._v("变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。推荐给所有变量加上花括号,避免不必要的错误,如:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token for-or-select variable"}},[t._v("skill")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" Java Python Shell"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 解释器会把$skillScript当成一个变量(其值为空)")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"I am good at '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$skillScript")]),t._v('"')]),t._v(" \n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"I am good at '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${skill}")]),t._v('Script"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br")])]),e("p",[t._v("已定义的变量,可以被重新定义,如:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("variable_name")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("new_value "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 使用变量的时候才加美元符($)")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("h3",{attrs:{id:"字符串变量"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#字符串变量"}},[t._v("#")]),t._v(" 字符串变量")]),t._v(" "),e("p",[e("strong",[t._v("字符串变量")]),t._v(":使用单引号 ' 或双引号 \" 来定义字符串,例如:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("my_string")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Hello, World!'")]),t._v("\n或者\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("my_string")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello, World!"')]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br")])]),e("p",[t._v("单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。")]),t._v(" "),e("p",[t._v("双引号里可以有变量,可以出现转义字符。")]),t._v(" "),e("p",[t._v("拼接字符串:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("your_name")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"runoob"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 使用双引号拼接")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("greeting_1")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello, "')]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$your_name")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('" !"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("greeting_2")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello, '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${your_name}")]),t._v(' !"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$greeting_1")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$greeting_2")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 使用单引号拼接")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("greeting_3")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'hello, '")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$your_name")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("' !'")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("greeting_4")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'hello, ${your_name} !'")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 原样输出hello, ${your_name} !")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$greeting_3")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$greeting_4")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br")])]),e("p",[t._v("获取字符串长度:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("string")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"abcd"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("#")]),t._v("string}")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 等价于 ${#string[0]}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br")])]),e("h3",{attrs:{id:"整数变量"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#整数变量"}},[t._v("#")]),t._v(" 整数变量")]),t._v(" "),e("p",[e("strong",[t._v("整数变量")]),t._v(": 在一些Shell中,你可以使用 "),e("strong",[t._v("declare")]),t._v(" 或 "),e("strong",[t._v("typeset")]),t._v(" 命令来声明整数变量。")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("declare")]),t._v(" -i "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("my_integer")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("42")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("h3",{attrs:{id:"数组变量"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#数组变量"}},[t._v("#")]),t._v(" 数组变量")]),t._v(" "),e("p",[e("strong",[t._v("数组变量:")]),t._v(" Shell 也支持数组,允许你在一个变量中存储多个值。")]),t._v(" "),e("p",[t._v('在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:')]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[t._v("数组名"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("值1 值2 "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(". 值n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("例如:")]),t._v(" "),e("div",{staticClass:"language-she line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("array_name=(value0 value1 value2 value3)\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("或者:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("array_name")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\nvalue0\nvalue1\nvalue2\nvalue3\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br")])]),e("p",[t._v("整数索引数组:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("my_array")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("Bash 支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。")]),t._v(" "),e("p",[t._v("关联数组使用 declare 命令来声明,语法格式如下:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("declare")]),t._v(" -A array_name\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[e("strong",[t._v("-A")]),t._v(" 选项就是用于声明一个关联数组。")]),t._v(" "),e("p",[t._v("关联数组的键是唯一的。")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("declare")]),t._v(" -A associative_array\nassociative_array"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"John"')]),t._v("\nassociative_array"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"age"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br")])]),e("p",[t._v("读取数组元素值的一般格式是:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${数组名"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("下标"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("例如:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("valuen")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${array_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("数组常用脚本:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[t._v("array_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("A\narray_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("B\narray_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("C\narray_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("D\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 获取数组中的所有元素")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"数组的元素为: '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${array_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("*"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("}")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"数组的元素为: '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${array_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("@"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("}")]),t._v('"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 在数组前加一个感叹号 ! 可以获取数组的所有键,例如:")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"数组的键为: '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("array_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("*"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("}")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"数组的键为: '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("array_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("@"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("}")]),t._v('"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 取得数组元素的个数")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"数组元素的个数为: '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("#")]),t._v("array_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("*"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("}")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"数组元素的个数为: '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("#")]),t._v("array_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("@"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("}")]),t._v('"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 取得数组单个元素的长度")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"第n个数组元素的长度为: '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("#")]),t._v("array_name"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("}")]),t._v('"')]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br"),e("span",{staticClass:"line-number"},[t._v("17")]),e("br"),e("span",{staticClass:"line-number"},[t._v("18")]),e("br"),e("span",{staticClass:"line-number"},[t._v("19")]),e("br")])]),e("h3",{attrs:{id:"环境变量"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#环境变量"}},[t._v("#")]),t._v(" 环境变量")]),t._v(" "),e("p",[e("strong",[t._v("环境变量:")]),t._v(" 这些是由操作系统或用户设置的特殊变量,用于配置 Shell 的行为和影响其执行环境。")]),t._v(" "),e("p",[t._v("例如,PATH 变量包含了操作系统搜索可执行文件的路径:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("h3",{attrs:{id:"特殊变量"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#特殊变量"}},[t._v("#")]),t._v(" 特殊变量")]),t._v(" "),e("p",[e("strong",[t._v("特殊变量:")]),t._v(" 有一些特殊变量在 Shell 中具有特殊含义。例如:")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"left"}},[t._v("特殊变量")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("说明")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("$0")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("脚本或函数的名称")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("$1...$2")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("$1 表示脚本或函数的第一个参数,$2 表示脚本或函数的第二个参数,当n>=10时,需要使用${n}来获取参数。。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("$#")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("传递到脚本或函数的参数个数")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("$*")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("传递给脚本或函数的全部参数。以一个单字符串显示所有传递到脚本或函数的参数")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("$$")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("脚本运行的当前进程ID号")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("$!")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("后台运行的最后一个进程的ID号")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("$@")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("传递给脚本或函数的全部参数。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("$-")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("显示Shell使用的当前选项,与set命令功能相同。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("$?")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。在Linux shell脚本中,可以使用特殊变量$?来获取上一个命令的退出状态码(exit status code)。这个状态码是上一个命令执行后退出的时候返回的数值。一般来说,如果命令执行成功,状态码为0;如果命令执行失败,状态码非0。退出状态码是一个0到255的整数。一般来说,正数的退出状态码是由程序自己定义的,通常用于表示不同的错误类型。而负数的退出状态码通常是由于shell内部错误或者是信号导致的。在实际应用中,你应该尽量避免返回负的退出状态码,除非这是由于shell内部的特定错误。如果你的程序需要返回错误代码,应当使用0以上的正数值。")])])])]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("退出码")]),t._v(" "),e("th",[t._v("解释")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("0")]),t._v(" "),e("td",[t._v("命令成功执行")])]),t._v(" "),e("tr",[e("td",[t._v("1")]),t._v(" "),e("td",[t._v("通用错误代码")])]),t._v(" "),e("tr",[e("td",[t._v("2")]),t._v(" "),e("td",[t._v("命令(或参数)使用不当")])]),t._v(" "),e("tr",[e("td",[t._v("126")]),t._v(" "),e("td",[t._v("权限被拒绝(或)无法执行")])]),t._v(" "),e("tr",[e("td",[t._v("127")]),t._v(" "),e("td",[t._v("未找到命令,或 PATH 错误")])]),t._v(" "),e("tr",[e("td",[t._v("128+n")]),t._v(" "),e("td",[t._v("命令被信号从外部终止,或遇到致命错误")])]),t._v(" "),e("tr",[e("td",[t._v("130")]),t._v(" "),e("td",[t._v("通过 Ctrl+C 或 SIGINT 终止(终止代码 2 或键盘中断)")])]),t._v(" "),e("tr",[e("td",[t._v("143")]),t._v(" "),e("td",[t._v("通过 SIGTERM 终止(默认终止)")])]),t._v(" "),e("tr",[e("td",[t._v("255/*")]),t._v(" "),e("td",[t._v("退出码超过了 0-255 的范围,因此重新计算(LCTT 译注:超过 255 后,用退出码对 256 取模)")])])])]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"left"}},[t._v("Exit Code Number")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("Meaning")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("Example")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("Comments")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("1")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("Catchall for general errors")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[e("code",[t._v("var1 = 1/0")])]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v('Miscellaneous errors, such as "divide by zero" and other impermissible operations')])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("126")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("Command invoked cannot execute")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[e("em",[t._v("/dev/null")])]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("Permission problem or command is not an executable")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("127")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v('"command not found"')]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("illegal_command")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("Possible problem with "),e("strong",[t._v("$PATH")]),t._v(" or a typo")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("128")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("Invalid argument to exit")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[e("em",[t._v("exit 3.14159")])]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("exit takes only integer args in the range 0 - 255 (see first footnote)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("128+n")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v('Fatal error signal "n"')]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[e("em",[t._v("kill -9")]),t._v(" $PPID of script")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("$?")]),t._v(" returns 137 (128 + 9)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("130")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("Script terminated by "),e("em",[t._v("Control-C")])]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[e("em",[t._v("Ctl-C")])]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[e("em",[t._v("Control-C")]),t._v(" is fatal error signal 2, (130 = 128 + 2, see above)")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("255*")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("Exit status out of range")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[e("em",[t._v("exit -1")])]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("exit takes only integer args in the range 0 - 255")])])])]),t._v(" "),e("p",[t._v("以下是一个简单的示例脚本,它检查最后一个命令的退出状态码,并打印出相应的消息:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token shebang important"}},[t._v("#!/bin/bash")]),t._v("\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 执行一个命令")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ls")]),t._v(" /some/directory\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 检查命令的退出状态码")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$?")]),t._v(" -eq "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"命令执行成功"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"命令执行失败,退出状态码为 '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$?")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br")])]),e("p",[t._v("在实际使用中,通常会直接在命令后面进行检查,而不是先执行命令,再检查"),e("code",[t._v("$?")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token shebang important"}},[t._v("#!/bin/bash")]),t._v("\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 直接在命令后检查状态码")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ls")]),t._v(" /some/directory"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"命令执行成功"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"命令执行失败,退出状态码为 '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$?")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br")])]),e("p",[t._v("知识扩展——return和exit的使用:")]),t._v(" "),e("ol",[e("li",[t._v("return是一个关键字; exit是一个函数。")]),t._v(" "),e("li",[t._v("return是编程语言级别,它表示调用堆栈的返回;exit是系统调用级别,它表示了一个进程的结束。")]),t._v(" "),e("li",[t._v("return是函数的退出(返回);exit是进程的退出,exit用于退出整个shell脚本进程。")])]),t._v(" "),e("h2",{attrs:{id:"shell-基本运算符"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#shell-基本运算符"}},[t._v("#")]),t._v(" Shell 基本运算符")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://www.runoob.com/linux/linux-shell-basic-operators.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.runoob.com/linux/linux-shell-basic-operators.html"),e("OutboundLink")],1)]),t._v(" "),e("h3",{attrs:{id:"算数运算符"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#算数运算符"}},[t._v("#")]),t._v(" 算数运算符")]),t._v(" "),e("p",[t._v("原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。")]),t._v(" "),e("p",[t._v("expr 是一款表达式计算工具,使用它能完成表达式的求值操作。")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token shebang important"}},[t._v("#!/bin/bash")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("val")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("expr")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" + "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"两数之和为 : '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$val")]),t._v('"')]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("p",[t._v("两点注意:")]),t._v(" "),e("ul",[e("li",[t._v("表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。")]),t._v(" "),e("li",[t._v("完整的表达式要被 "),e("strong",[t._v("``")]),t._v(" 包含,注意这个字符不是常用的单引号,在 Esc 键下边。")])]),t._v(" "),e("h3",{attrs:{id:"自增和自减操作符"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#自增和自减操作符"}},[t._v("#")]),t._v(" 自增和自减操作符")]),t._v(" "),e("p",[t._v("使用 $(( )) 进行算术运算")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token shebang important"}},[t._v("#!/bin/bash")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 初始化变量")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("num")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 自增")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("num")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$((")]),t._v("num "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("))")])]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 自减")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("num")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$((")]),t._v("num "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("))")])]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$num")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br")])]),e("h3",{attrs:{id:"关系运算符-数值"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#关系运算符-数值"}},[t._v("#")]),t._v(" 关系运算符(数值)")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"left"}},[t._v("运算符")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("说明")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("举例")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-eq")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测两个数是否相等,相等返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ $a -eq $b ] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-ne")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测两个数是否不相等,不相等返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ $a -ne $b ] 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-gt")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测左边的数是否大于右边的,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ $a -gt $b ] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-lt")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测左边的数是否小于右边的,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ $a -lt $b ] 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-ge")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测左边的数是否大于等于右边的,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ $a -ge $b ] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-le")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测左边的数是否小于等于右边的,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ $a -le $b ] 返回 true。")])])])]),t._v(" "),e("p",[t._v("如果使用 "),e("code",[t._v("((...))")]),t._v(" 作为判断语句,大于和小于可以直接使用 > 和 <,其他如此类推。")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"left"}},[t._v("运算符")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("说明")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("举例")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("==")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测两个数是否相等,相等返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("(( $a == $b )) 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("!=")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测两个数是否不相等,不相等返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("(( $a != $b )) 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v(">")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测左边的数是否大于右边的,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("(( $a > $b )) 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("<")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测左边的数是否小于右边的,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("(( $a < $b )) 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v(">=")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测左边的数是否大于等于右边的,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("(( $a >= $b )) 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("<=")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测左边的数是否小于等于右边的,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("(( $a <= $b )) 返回 true。")])])])]),t._v(" "),e("h3",{attrs:{id:"字符串运算符"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#字符串运算符"}},[t._v("#")]),t._v(" 字符串运算符")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"left"}},[t._v("运算符")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("说明")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("举例")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("=")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测两个字符串是否相等,相等返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[[ $a = $b ]] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("!=")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测两个字符串是否不相等,不相等返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[[ $a != $b ]] 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-z")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测字符串长度是否为0,为0返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[[ -z $a ]] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-n")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测字符串长度是否不为 0,不为 0 返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v('[[ -n "$a" ]] 返回 true。')])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("$")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测字符串是否不为空,不为空返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[[ $a ]] 返回 true。")])])])]),t._v(" "),e("h3",{attrs:{id:"文件测试运算符"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#文件测试运算符"}},[t._v("#")]),t._v(" 文件测试运算符")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"left"}},[t._v("操作符")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("说明")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("举例")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-b file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否是块设备文件,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -b $file ] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-c file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否是字符设备文件,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -c $file ] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-d file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否是目录,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -d $file ] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-f file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -f $file ] 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-g file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否设置了 SGID 位,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -g $file ] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-k file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -k $file ] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-p file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否是有名管道,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -p $file ] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-u file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否设置了 SUID 位,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -u $file ] 返回 false。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-r file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否可读,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -r $file ] 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-w file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否可写,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -w $file ] 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-x file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否可执行,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -x $file ] 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-s file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否为空(文件大小是否大于0),不为空返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -s $file ] 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-e file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件(包括目录)是否存在,如果是,则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ -e $file ] 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-S file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("判断某文件是否 socket。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}})]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-L file")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("检测文件是否存在并且是一个符号链接。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}})])])]),t._v(" "),e("h3",{attrs:{id:"布尔运算符"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#布尔运算符"}},[t._v("#")]),t._v(" 布尔运算符")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"left"}},[t._v("运算符")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("说明")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("举例")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("!")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("非运算,表达式为 true 则返回 false,否则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ ! false ] 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-o")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("或运算,有一个表达式为 true 则返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ $a -lt 20 -o $b -gt 100 ] 返回 true。")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("-a")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("与运算,两个表达式都为 true 才返回 true。")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[ $a -lt 20 -a $b -gt 100 ] 返回 false。")])])])]),t._v(" "),e("h3",{attrs:{id:"逻辑运算符"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#逻辑运算符"}},[t._v("#")]),t._v(" 逻辑运算符")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"left"}},[t._v("运算符")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("说明")]),t._v(" "),e("th",{staticStyle:{"text-align":"left"}},[t._v("举例")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("&&")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("逻辑的 AND")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[[ $a -lt 100 && $b -gt 100 ]] 返回 false")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[t._v("||")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("逻辑的 OR")]),t._v(" "),e("td",{staticStyle:{"text-align":"left"}},[t._v("[[ $a -lt 100 || $b -gt 100 ]] 返回 true")])])])]),t._v(" "),e("h2",{attrs:{id:"shell-test-命令"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#shell-test-命令"}},[t._v("#")]),t._v(" Shell test 命令")]),t._v(" "),e("p",[t._v("Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。")]),t._v(" "),e("p",[t._v("在Shell脚本中,‌"),e("code",[t._v("test")]),t._v("命令和"),e("code",[t._v("[]")]),t._v("(‌方括号表达式)‌都用于条件测试,‌但它们在使用上有一些区别。‌")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("test命令")]),t._v(":‌这是一个独立的命令,‌用于测试条件表达式的值,‌并根据测试结果返回0(‌真)‌或非0值(‌假)‌。‌例如,‌"),e("code",[t._v("test -f file.txt")]),t._v("会检查"),e("code",[t._v("file.txt")]),t._v("是否存在并且是一个普通文件。‌如果条件为真,‌则返回0;‌否则返回非0值。‌")]),t._v(" "),e("li",[e("strong",[t._v("方括号表达式")]),t._v(":‌"),e("code",[t._v("[ ]")]),t._v("用于在脚本中进行条件测试,‌它实际上是一个命令替换的语法,‌可以与逻辑运算符一起使用。‌例如,‌"),e("code",[t._v("[ -f file.txt ]")]),t._v("与"),e("code",[t._v("test -f file.txt")]),t._v("是等价的。‌方括号表达式也返回0或非0值,‌表示条件的真假。‌")])]),t._v(" "),e("p",[t._v("在Shell脚本中,‌"),e("code",[t._v("test")]),t._v("命令和"),e("code",[t._v("[]")]),t._v("通常可以互换使用,‌但有一些细微的差别。‌例如,‌当使用逻辑运算符如"),e("code",[t._v("&&")]),t._v("和"),e("code",[t._v("||")]),t._v("时,‌"),e("code",[t._v("[]")]),t._v("不支持旧式的"),e("code",[t._v("-a")]),t._v("和"),e("code",[t._v("-o")]),t._v("运算符,‌而推荐使用"),e("code",[t._v("&&")]),t._v("和"),e("code",[t._v("||")]),t._v("。‌此外,‌对于模式匹配和正则表达式匹配,‌通常使用"),e("code",[t._v("[[ ]]")]),t._v("(‌双左方括号)‌,‌而基本的条件测试则可以使用"),e("code",[t._v("[ ]")]),t._v("或"),e("code",[t._v("test")]),t._v("命令。‌")]),t._v(" "),e("p",[t._v("总的来说,‌虽然"),e("code",[t._v("test")]),t._v("命令和"),e("code",[t._v("[]")]),t._v("在功能上是相似的,‌但它们的使用场景和语法有所不同。‌在编写Shell脚本时,‌应根据具体的需求和上下文选择合适的方法进行条件测试。")]),t._v(" "),e("h2",{attrs:{id:"shell-括号的用法"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#shell-括号的用法"}},[t._v("#")]),t._v(" Shell 括号的用法")]),t._v(" "),e("p",[t._v("在Shell中,‌括号有小括号、‌中括号和大括号。‌每种括号都有其特定的用途和语法规则。‌")]),t._v(" "),e("ul",[e("li",[e("p",[e("strong",[t._v("小括号")]),t._v(":‌")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("单小括号:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("用于命令替换。‌例如,‌"),e("code",[t._v("echo $(ls)")]),t._v("会执行"),e("code",[t._v("ls")]),t._v("命令,‌并将输出作为"),e("code",[t._v("echo")]),t._v("命令的参数,等同于"),e("code",[t._v("echo `ls`")]),t._v("。‌")])]),t._v(" "),e("li",[e("p",[t._v("用于命令组合和执行,‌可以创建一个子shell来顺序执行命令。‌例如,‌"),e("code",[t._v("(pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)")]),t._v(" 会创建一个子shell并执行其中的命令。‌")])]),t._v(" "),e("li",[e("p",[t._v("用于初始化数组。‌例如,‌"),e("code",[t._v("array=(a b c d)")]),t._v("会创建一个包含元素a、‌b、‌c、‌d的数组。‌")])])])]),t._v(" "),e("li",[e("p",[t._v("双小括号:")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("用于算术运算和比较。‌((表达式))常用于算术运算比较,双括号中的变量可以不使用$符号前缀。")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token shebang important"}},[t._v("#!/bin/bash")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#求100以内的偶数")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("num")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("((")]),t._v("num"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#数值与运算符可以没有空格,变量的使用时也可以不使用$num")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$num")]),t._v('"')]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("((")]),t._v("num"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("num"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br")])])]),t._v(" "),e("li",[e("p",[t._v("用于循环语句。‌例如,‌"),e("code",[t._v("for((i=0;i<5;i++))")]),t._v("可以在双小括号内进行循环变量的递增。‌")])])])])])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("中括号")]),t._v(":‌")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("单中括号:")]),t._v(" "),e("ul",[e("li",[t._v("用于条件表达式,算术比较,例如,‌"),e("code",[t._v("[ $i -ge 1 ]")]),t._v(" 进行数值比较。")]),t._v(" "),e("li",[t._v("用于条件表达式,文件测试,例如,"),e("code",[t._v("[ -d $file ]")]),t._v(" 检测文件是否是目录。")]),t._v(" "),e("li",[t._v("字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。例如,"),e("code",[t._v('cat 1.txt|grep "[0-9]"')]),t._v("。")]),t._v(" "),e("li",[t._v("引用数组中每个元素。例如,"),e("code",[t._v("${array_name[2]}")]),t._v("。")])])]),t._v(" "),e("li",[e("p",[t._v("双中括号:")]),t._v(" "),e("ul",[e("li",[t._v("用于条件表达式,‌字符串比较,例如,"),e("code",[t._v("[[ hello == hell? ]]")]),t._v(" 进行字符串模式匹配和正则表达式匹配。‌在进行字符串比较时,最好使用双中括号 [[ ]]. 因为单中括号可能会导致一些错误,因此最好避开它们。")])])])])]),t._v(" "),e("li",[e("p",[e("strong",[t._v("大括号")]),t._v(":‌")]),t._v(" "),e("ul",[e("li",[t._v("帮助解释器识别变量的边界。")]),t._v(" "),e("li",[t._v("用于变量替换,‌如 "),e("code",[t._v("${var:-string}")]),t._v(" 当变量为空时,‌将string赋值给var。‌")]),t._v(" "),e("li",[t._v("在序列生成中,‌如 "),e("code",[t._v("{1..4}")]),t._v(" 用于生成数字序列。‌")]),t._v(" "),e("li",[t._v("用于文件名扩展,‌如 "),e("code",[t._v("{1,4}.txt")]),t._v(" 可以生成1.txt和4.txt两个文件,"),e("code",[t._v("cp /path/to/file.txt{,.backup}")]),t._v(" 可以在/path/to目录下生成备份文件file.txt.backup。‌")])])])]),t._v(" "),e("p",[t._v("在Shell脚本中,‌单中括号"),e("code",[t._v("[ ]")]),t._v("和双中括号"),e("code",[t._v("[[ ]]")]),t._v("各有其用途,‌选择使用哪种括号取决于特定的需求和场景。‌")]),t._v(" "),e("ul",[e("li",[e("strong",[t._v("单中括号"),e("code",[t._v("[ ]")])]),t._v(":‌\n"),e("ul",[e("li",[t._v("主要用于测试条件表达式的返回值,‌它是一个测试命令,‌返回0表示真,‌非0表示假。‌")]),t._v(" "),e("li",[t._v("在进行算术比较或算术运算时,‌单中括号"),e("code",[t._v("[ ]")]),t._v("更为合适。‌例如,‌进行数值比较或执行算术运算时,‌应使用单中括号。‌")]),t._v(" "),e("li",[t._v("单中括号内的表达式需要特别注意空格的使用,‌例如"),e("code",[t._v("[ $a -eq $b ]")]),t._v(",‌缺少空格可能会导致错误。‌")])])]),t._v(" "),e("li",[e("strong",[t._v("双中括号"),e("code",[t._v("[[ ]]")])]),t._v(":‌\n"),e("ul",[e("li",[t._v("提供了更强大的字符串处理能力,‌支持模式匹配和正则表达式,‌对于字符串和文件名的处理更为灵活。‌")]),t._v(" "),e("li",[t._v("双中括号在条件判断时可以不用引号包围变量,‌也可以支持逻辑操作符"),e("code",[t._v("&&")]),t._v("、‌"),e("code",[t._v("||")]),t._v(",‌并且不需要转义字符。‌")]),t._v(" "),e("li",[t._v("双中括号在语法上更接近于其他编程语言,‌提供了一定的编程便利性。‌")])])])]),t._v(" "),e("p",[t._v("总结来说,‌当需要进行算术比较或运算时,‌应使用单中括号"),e("code",[t._v("[ ]")]),t._v(";‌而当需要进行字符串处理、‌模式匹配或提供更友好的语法时,‌应使用双中括号"),e("code",[t._v("[[ ]]")]),t._v("。‌在实际应用中,‌根据具体的需求选择合适的括号可以提高脚本的健壮性和可读性。")]),t._v(" "),e("h2",{attrs:{id:"shell-流程控制"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#shell-流程控制"}},[t._v("#")]),t._v(" Shell 流程控制")]),t._v(" "),e("h3",{attrs:{id:"条件结构"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#条件结构"}},[t._v("#")]),t._v(" 条件结构")]),t._v(" "),e("p",[t._v("if 语法格式:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" condition\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n command1 \n command2\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n commandN \n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 写成一行")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" condition"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v(" command1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" command2… "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br")])]),e("p",[t._v("if else 语法格式:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" condition\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n command1 \n command2\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n commandN\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("command")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br")])]),e("p",[t._v("if else-if else 语法格式:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" condition1\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n command1\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("elif")]),t._v(" condition2 \n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v(" \n command2\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v("\n commandN\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br")])]),e("p",[e("strong",[t._v("case ... esac")]),t._v(" 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 "),e("strong",[t._v(";;")]),t._v(" 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。")]),t._v(" "),e("p",[t._v("可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。")]),t._v(" "),e("p",[t._v("case ... esac 语法格式:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("case")]),t._v(" 值 "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v("\n模式1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n command1\n command2\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n commandN\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n模式2"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n command1\n command2\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n commandN\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("esac")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br")])]),e("h3",{attrs:{id:"循环结构"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#循环结构"}},[t._v("#")]),t._v(" 循环结构")]),t._v(" "),e("p",[t._v("for 语法格式:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token for-or-select variable"}},[t._v("var")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" item1 item2 "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(". itemN\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v("\n command1\n command2\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n commandN\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 写成一行")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token for-or-select variable"}},[t._v("var")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" item1 item2 "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(". itemN"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v(" command1"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" command2… "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 无限循环语法格式")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("((")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("command")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br")])]),e("p",[t._v("while 语法格式:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" condition\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("command")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 无限循环语法格式一")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("command")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 无限循环语法格式二")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("command")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br"),e("span",{staticClass:"line-number"},[t._v("6")]),e("br"),e("span",{staticClass:"line-number"},[t._v("7")]),e("br"),e("span",{staticClass:"line-number"},[t._v("8")]),e("br"),e("span",{staticClass:"line-number"},[t._v("9")]),e("br"),e("span",{staticClass:"line-number"},[t._v("10")]),e("br"),e("span",{staticClass:"line-number"},[t._v("11")]),e("br"),e("span",{staticClass:"line-number"},[t._v("12")]),e("br"),e("span",{staticClass:"line-number"},[t._v("13")]),e("br"),e("span",{staticClass:"line-number"},[t._v("14")]),e("br"),e("span",{staticClass:"line-number"},[t._v("15")]),e("br"),e("span",{staticClass:"line-number"},[t._v("16")]),e("br")])]),e("p",[t._v("until 循环执行一系列命令直至条件为 true 时停止。")]),t._v(" "),e("p",[t._v("until 循环与 while 循环在处理方式上刚好相反。")]),t._v(" "),e("p",[t._v("until 语法格式:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("until")]),t._v(" condition\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("command")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br")])]),e("p",[t._v("在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell 使用两个命令来实现该功能:"),e("strong",[t._v("break")]),t._v(" 和 "),e("strong",[t._v("continue")]),t._v("。")]),t._v(" "),e("p",[t._v("break 命令允许跳出所有循环(终止执行后面的所有循环)。")]),t._v(" "),e("p",[t._v("continue 命令与 break 命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。")]),t._v(" "),e("h2",{attrs:{id:"shell-函数"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#shell-函数"}},[t._v("#")]),t._v(" Shell 函数")]),t._v(" "),e("p",[t._v("Shell 函数定义语法格式:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("function")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" funname "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n action"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("return int"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br"),e("span",{staticClass:"line-number"},[t._v("2")]),e("br"),e("span",{staticClass:"line-number"},[t._v("3")]),e("br"),e("span",{staticClass:"line-number"},[t._v("4")]),e("br"),e("span",{staticClass:"line-number"},[t._v("5")]),e("br")])]),e("p",[t._v("说明:")]),t._v(" "),e("ol",[e("li",[t._v("可以带 function fun() 定义,也可以直接 fun() 定义,不带任何参数。")]),t._v(" "),e("li",[t._v("所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。")]),t._v(" "),e("li",[t._v("在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。")]),t._v(" "),e("li",[t._v("函数返回值,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 语句只能返回一个介于 0 到 255 之间的整数。")]),t._v(" "),e("li",[t._v("函数返回值在调用该函数后通过 $? 来获得。")])]),t._v(" "),e("h2",{attrs:{id:"shell-命令连接"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#shell-命令连接"}},[t._v("#")]),t._v(" Shell 命令连接")]),t._v(" "),e("p",[t._v("在Shell中,命令连接可以使用多种符号,常见的有以下几种:")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("类型")]),t._v(" "),e("th",[t._v("符号")]),t._v(" "),e("th",[t._v("说明")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("分号")]),t._v(" "),e("td",[t._v(";")]),t._v(" "),e("td",[t._v("无论前一个命令执行成功与否,都会执行下一条命令。")])]),t._v(" "),e("tr",[e("td"),t._v(" "),e("td",[t._v("&")]),t._v(" "),e("td",[t._v("多个命令同时执行,不管命令是否执行成功。")])]),t._v(" "),e("tr",[e("td",[t._v("逻辑与")]),t._v(" "),e("td",[t._v("&&")]),t._v(" "),e("td",[t._v("只有前一个命令执行成功时,才会执行下一条命令。")])]),t._v(" "),e("tr",[e("td",[t._v("逻辑或")]),t._v(" "),e("td",[t._v("||")]),t._v(" "),e("td",[t._v("只有前一个命令执行失败时,才会执行下一条命令。")])]),t._v(" "),e("tr",[e("td",[t._v("管道")]),t._v(" "),e("td",[t._v("|")]),t._v(" "),e("td",[t._v("将前一个命令的输出作为后一个命令的输入。")])])])]),t._v(" "),e("h2",{attrs:{id:"标准输入-输出和重定向"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#标准输入-输出和重定向"}},[t._v("#")]),t._v(" 标准输入/输出和重定向")]),t._v(" "),e("p",[t._v("执行一个shell命令行,系统有三个默认的文件描述符供程序使用。标准输入文件(STDIN),通常对应终端的键盘;标准输出文件(STDOUT)和标准错误输出文件(STDERR),这两个文件都对应终端的屏幕。")]),t._v(" "),e("p",[t._v("使用符合 “>” 将屏幕的输出导入到文件,屏幕不再有显示,“>” 会覆盖之前的内容。")]),t._v(" "),e("p",[t._v("使用符合 “>>” 将屏幕的输出追加到文件,屏幕不再有显示,“>>” 不会覆盖之前的内容。")]),t._v(" "),e("p",[t._v("标准输入用“0”表示。")]),t._v(" "),e("p",[t._v("标准正确输出用 “1” 表示。“1”可以省略。"),e("code",[t._v(">file")]),t._v("等同于"),e("code",[t._v("1>file")]),t._v(","),e("code",[t._v(">>file")]),t._v("等同于"),e("code",[t._v("1>>file")])]),t._v(" "),e("p",[t._v("标准错误输出用 “2” 表示。")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("类型")]),t._v(" "),e("th",[t._v("操作符")]),t._v(" "),e("th",[t._v("用途")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("重定向输入")]),t._v(" "),e("td",[t._v("<")]),t._v(" "),e("td",[t._v("从指定的文件读取数据,而不是从键盘输入")])]),t._v(" "),e("tr",[e("td",[t._v("重定向输出")]),t._v(" "),e("td",[t._v(">")]),t._v(" "),e("td",[t._v("将输出结果保存到指定的文件(覆盖原有内容)")])]),t._v(" "),e("tr",[e("td",[t._v("重定向输出")]),t._v(" "),e("td",[t._v(">>")]),t._v(" "),e("td",[t._v("将输出结果追加到指定的文件尾部")])]),t._v(" "),e("tr",[e("td",[t._v("标准错误输出")]),t._v(" "),e("td",[t._v("2>")]),t._v(" "),e("td",[t._v("将错误信息保存到指定的文件(覆盖原有内容)")])]),t._v(" "),e("tr",[e("td",[t._v("标准错误输出")]),t._v(" "),e("td",[t._v("2>>")]),t._v(" "),e("td",[t._v("将错误信息追加到指定的文件尾部")])]),t._v(" "),e("tr",[e("td",[t._v("混合输出")]),t._v(" "),e("td",[t._v("&>")]),t._v(" "),e("td",[t._v("将标准正确输出、标准错误输出的内容保存到同一文件(覆盖原有内容)")])]),t._v(" "),e("tr",[e("td",[t._v("混合输出")]),t._v(" "),e("td",[t._v("&>>")]),t._v(" "),e("td",[t._v("将标准正确输出、标准错误输出的内容追加到指定的文件尾部")])])])]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("nohup")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("command")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("/dev/null "),e("span",{pre:!0,attrs:{class:"token operator"}},[e("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("2")]),t._v(">")]),e("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[t._v("&1")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[e("strong",[t._v("nohup")]),t._v(" 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。")]),t._v(" "),e("p",[e("strong",[t._v("nohup")]),t._v(" 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 "),e("strong",[t._v("$HOME/nohup.out")]),t._v(" 文件中。")]),t._v(" "),e("p",[e("strong",[t._v("nohup")]),t._v(" 命令语法格式:")]),t._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("nohup")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("command")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("arg"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("."),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&")]),t._v("\n")])]),t._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[t._v("1")]),e("br")])]),e("p",[t._v("命令 "),e("code",[t._v("/dev/null 2>&1 &")]),t._v(" 的主要作用是将程序的标准输出和错误输出都重定向到 "),e("code",[t._v("/dev/null")]),t._v(",从而屏蔽这些输出,使得运行该命令的用户不会看到任何输出信息。")]),t._v(" "),e("p",[t._v("这个命令组合可以分解为几个部分来理解:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("/dev/null")]),t._v(" 代表空设备文件,是一个特殊的文件,所有写入它的内容都会被永久丢弃,因此被称为“黑洞”或“垃圾桶”。")]),t._v(" "),e("li",[e("code",[t._v(">/dev/null")]),t._v("等同于"),e("code",[t._v("1>/dev/null")]),t._v(",将标准错误输出保存到空设备文件。")]),t._v(" "),e("li",[e("code",[t._v("2>&1")]),t._v(" 是一个shell重定向技巧,它将标准错误输出(文件描述符2)重定向到标准输出(文件描述符1)当前指向的位置。在这个上下文中,由于标准输出也被重定向到了 "),e("code",[t._v("/dev/null")]),t._v(",因此标准错误输出也随之被丢弃。")]),t._v(" "),e("li",[e("code",[t._v("&")]),t._v(" 在命令的末尾表示将命令放到后台执行,这样用户可以在不等待命令执行完成的情况下继续使用终端。‌")])]),t._v(" "),e("h2",{attrs:{id:"参考资料"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#参考资料"}},[t._v("#")]),t._v(" 参考资料")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://www.runoob.com/linux/linux-shell.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.runoob.com/linux/linux-shell.html"),e("OutboundLink")],1)])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/47.950fba1f.js b/assets/js/47.950fba1f.js new file mode 100644 index 00000000..92931e52 --- /dev/null +++ b/assets/js/47.950fba1f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{662:function(t,s,a){t.exports=a.p+"assets/img/20240206230109.b3017dfb.png"},756:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h2",{attrs:{id:"allure"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#allure"}},[t._v("#")]),t._v(" Allure")]),t._v(" "),n("p",[n("a",{attrs:{href:"https://allurereport.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Allure"),n("OutboundLink")],1),t._v(", Automation Test Reporting Tool.")]),t._v(" "),n("p",[t._v("Simple. Fun. Language and Framework agnostic. Designed to create fancy and clear testing reports in minutes. Loved by the community, developed by Qameta Software & Open-source contributors.")]),t._v(" "),n("h3",{attrs:{id:"allure-report-installation"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#allure-report-installation"}},[t._v("#")]),t._v(" Allure report installation")]),t._v(" "),n("p",[t._v("Install from an archive (for any system)")]),t._v(" "),n("ol",[n("li",[t._v("Make sure Java version 8 or above installed, and its directory is specified in the "),n("code",[t._v("JAVA_HOME")]),t._v(" environment variable.")]),t._v(" "),n("li",[t._v("Go to "),n("a",{attrs:{href:"https://github.com/allure-framework/allure2/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[t._v("the latest Allure Report release on GitHub"),n("OutboundLink")],1),t._v(" and download the "),n("code",[t._v("allure-*.zip")]),t._v(" or "),n("code",[t._v("allure-*.tgz")]),t._v(" archive.")]),t._v(" "),n("li",[t._v("Uncompress the archive into any directory. The Allure Report can now be run using the "),n("code",[t._v("bin/allure")]),t._v(" or "),n("code",[t._v("bin/allure.bat")]),t._v(" script, depending on the operating system.")]),t._v(" "),n("li",[t._v("Add "),n("code",[t._v("/path/to/allure/bin")]),t._v(" to environment variables.")])]),t._v(" "),n("p",[t._v("refer to "),n("a",{attrs:{href:"https://allurereport.org/docs/gettingstarted-installation/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://allurereport.org/docs/gettingstarted-installation/"),n("OutboundLink")],1)]),t._v(" "),n("h3",{attrs:{id:"how-it-works"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#how-it-works"}},[t._v("#")]),t._v(" How it works")]),t._v(" "),n("p",[n("img",{attrs:{src:a(662),alt:""}})]),t._v(" "),n("h4",{attrs:{id:"run-tests"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#run-tests"}},[t._v("#")]),t._v(" Run tests")]),t._v(" "),n("p",[t._v("Run your tests as you would do normally: from the command line, from your IDE, etc.")]),t._v(" "),n("p",[t._v("In addition to printing or saving the test results in its own format (Test results on the picture above), the Allure Report adapter receives the data from a test framework. The API used for this communication depends on the framework.")]),t._v(" "),n("h5",{attrs:{id:"junit-5"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#junit-5"}},[t._v("#")]),t._v(" JUnit 5")]),t._v(" "),n("p",[t._v("To integrate "),n("a",{attrs:{href:"https://allurereport.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Allure"),n("OutboundLink")],1),t._v(" into an existing "),n("strong",[t._v("JUnit 5 (Jupiter)")]),t._v(" project, you need to:")]),t._v(" "),n("p",[t._v("Add Allure dependencies to your project.")]),t._v(" "),n("div",{staticClass:"language-xml line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-xml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Define the version of Allure you want to use via the allure.version property --\x3e")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("allure.version")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("2.25.0"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Add allure-bom to dependency management to ensure correct versions of all the dependencies are used --\x3e")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependencyManagement")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependencies")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("io.qameta.allure"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("allure-bom"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("${allure.version}"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("type")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("pom"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("scope")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("import"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Add necessary Allure dependencies to dependencies section --\x3e")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependencies")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("io.qameta.allure"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("allure-junit5"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("scope")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("test"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br")])]),n("p",[t._v("Set up AspectJ for "),n("code",[t._v("@Step")]),t._v(" and "),n("code",[t._v("@Attachment")]),t._v(" annotations support.")]),t._v(" "),n("div",{staticClass:"language-xml line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-xml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Define the version of AspectJ --\x3e")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("aspectj.version")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("1.9.21"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Add the following options to your maven-surefire-plugin --\x3e")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("plugin")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.apache.maven.plugins"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("maven-surefire-plugin"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("3.2.3"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("configuration")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("argLine")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v('\n -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"\n '),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependencies")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.aspectj"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("aspectjweaver"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("${aspectj.version}"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br")])]),n("p",[t._v("Designate a location for Allure results storage.")]),t._v(" "),n("p",[t._v("Allure, by default, saves test results in the project's root directory. However, it is recommended to store your test results in the build output directory.")]),t._v(" "),n("p",[t._v("To configure this, create an "),n("code",[t._v("allure.properties")]),t._v(" file and place it in the test resources directory of your project, which is typically located at "),n("code",[t._v("src/test/resources")]),t._v(":")]),t._v(" "),n("div",{staticClass:"language-properties line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-properties"}},[n("code",[n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("allure.results.directory")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("target/allure-results")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[t._v("Run tests")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("mvnw verify\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Execute all test files")]),t._v("\nmvn "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Execute the given test file")]),t._v("\nmvn clean "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" -Dtest"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("xxxx\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br")])]),n("p",[t._v("More detail see "),n("a",{attrs:{href:"https://allurereport.org/docs/junit5/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://allurereport.org/docs/junit5/"),n("OutboundLink")],1)]),t._v(" "),n("h5",{attrs:{id:"cucumber-jvm"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#cucumber-jvm"}},[t._v("#")]),t._v(" Cucumber-JVM")]),t._v(" "),n("p",[t._v("To integrate "),n("a",{attrs:{href:"https://allurereport.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Allure"),n("OutboundLink")],1),t._v(" into an existing "),n("strong",[t._v("Cucumber-JVM")]),t._v(" project, you need to:")]),t._v(" "),n("ol",[n("li",[t._v("Add Allure dependencies to your project.")]),t._v(" "),n("li",[t._v("Activate the Allure Cucumber-JVM plugin.")]),t._v(" "),n("li",[t._v("Set up AspectJ for "),n("code",[t._v("@Step")]),t._v(" and "),n("code",[t._v("@Attachment")]),t._v(" annotations support.")]),t._v(" "),n("li",[t._v("Designate a location for Allure results storage.")])]),t._v(" "),n("p",[t._v("The specific implementation of these steps varies based on how your Cucumber-JVM is set up. Cucumber-JVM can be used with three different types of runners:")]),t._v(" "),n("ul",[n("li",[t._v("JUnit Platform (recommended)")]),t._v(" "),n("li",[t._v("TestNG")]),t._v(" "),n("li",[t._v("JUnit 4 (deprecated)")])]),t._v(" "),n("p",[t._v("JUnit Platform is the recommended runner for Cucumber-JVM tests. Here is an example:")]),t._v(" "),n("p",[t._v("Add Allure dependencies to your project.")]),t._v(" "),n("div",{staticClass:"language-xml line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-xml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Define the version of Allure you want to use via the allure.version property --\x3e")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("allure.version")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("2.24.0"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Add allure-bom to dependency management to ensure correct versions of all the dependencies are used --\x3e")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependencyManagement")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependencies")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("io.qameta.allure"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("allure-bom"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("${allure.version}"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("type")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("pom"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("scope")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("import"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- Add necessary Allure dependencies to dependencies section --\x3e")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependencies")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("io.qameta.allure"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("allure-cucumber7-jvm"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("scope")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("test"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("io.qameta.allure"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("allure-junit-platform"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("scope")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("test"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token tag"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br"),n("span",{staticClass:"line-number"},[t._v("10")]),n("br"),n("span",{staticClass:"line-number"},[t._v("11")]),n("br"),n("span",{staticClass:"line-number"},[t._v("12")]),n("br"),n("span",{staticClass:"line-number"},[t._v("13")]),n("br"),n("span",{staticClass:"line-number"},[t._v("14")]),n("br"),n("span",{staticClass:"line-number"},[t._v("15")]),n("br"),n("span",{staticClass:"line-number"},[t._v("16")]),n("br"),n("span",{staticClass:"line-number"},[t._v("17")]),n("br"),n("span",{staticClass:"line-number"},[t._v("18")]),n("br"),n("span",{staticClass:"line-number"},[t._v("19")]),n("br"),n("span",{staticClass:"line-number"},[t._v("20")]),n("br"),n("span",{staticClass:"line-number"},[t._v("21")]),n("br"),n("span",{staticClass:"line-number"},[t._v("22")]),n("br"),n("span",{staticClass:"line-number"},[t._v("23")]),n("br"),n("span",{staticClass:"line-number"},[t._v("24")]),n("br"),n("span",{staticClass:"line-number"},[t._v("25")]),n("br"),n("span",{staticClass:"line-number"},[t._v("26")]),n("br"),n("span",{staticClass:"line-number"},[t._v("27")]),n("br"),n("span",{staticClass:"line-number"},[t._v("28")]),n("br"),n("span",{staticClass:"line-number"},[t._v("29")]),n("br"),n("span",{staticClass:"line-number"},[t._v("30")]),n("br"),n("span",{staticClass:"line-number"},[t._v("31")]),n("br")])]),n("p",[t._v("Activate the Allure Cucumber-JVM plugin.")]),t._v(" "),n("p",[t._v("Create a "),n("code",[t._v("src/test/resources/junit-platform.properties")]),t._v(" file and add property "),n("code",[t._v("cucumber.plugin")]),t._v(" with value "),n("code",[t._v("io.qameta.allure.cucumber7jvm.AllureCucumber7Jvm")]),t._v(":")]),t._v(" "),n("div",{staticClass:"language-properties line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-properties"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#junit-platform.properties")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("cucumber.plugin")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),n("span",{pre:!0,attrs:{class:"token attr-value"}},[t._v("io.qameta.allure.cucumber7jvm.AllureCucumber7Jvm")]),t._v("\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[t._v("Set up AspectJ for "),n("code",[t._v("@Step")]),t._v(" and "),n("code",[t._v("@Attachment")]),t._v(" annotations support.")]),t._v(" "),n("p",[t._v("Designate a location for Allure results storage.")]),t._v(" "),n("p",[t._v("More detail refer to "),n("a",{attrs:{href:"https://allurereport.org/docs/cucumberjvm/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://allurereport.org/docs/cucumberjvm/"),n("OutboundLink")],1)]),t._v(" "),n("h5",{attrs:{id:"pytest"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#pytest"}},[t._v("#")]),t._v(" pytest")]),t._v(" "),n("p",[t._v("Install the Allure pytest adapter")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("pip "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" allure-pytest\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br")])]),n("p",[t._v("Run tests")]),t._v(" "),n("div",{staticClass:"language-shell line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-shell"}},[n("code",[t._v("pytest\npytest --clean-alluredir\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br")])]),n("p",[t._v("This will save necessary data into "),n("code",[t._v("allure-results")]),t._v(" or other directory, according to the settings. , see "),n("a",{attrs:{href:"https://allurereport.org/docs/pytest-configuration/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Configuration"),n("OutboundLink")],1),t._v(".")]),t._v(" "),n("p",[t._v("Here's an example of a "),n("code",[t._v("pytest.ini")]),t._v(" configuration file:")]),t._v(" "),n("div",{staticClass:"language-ini line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-ini"}},[n("code",[n("span",{pre:!0,attrs:{class:"token header"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("pytest")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("addopts")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("--clean-alluredir")]),t._v("\n --alluredir allure-results\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br")])]),n("p",[t._v("More detail see "),n("a",{attrs:{href:"https://allurereport.org/docs/pytest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://allurereport.org/docs/pytest/"),n("OutboundLink")],1)]),t._v(" "),n("h4",{attrs:{id:"generate-html-report"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#generate-html-report"}},[t._v("#")]),t._v(" Generate HTML report")]),t._v(" "),n("p",[t._v("Generate the HTML report by using one of the two Allure command-line commands.")]),t._v(" "),n("ul",[n("li",[n("code",[t._v("allure generate")]),t._v(" processes the test results and saves an HTML report into the specified directory ("),n("code",[t._v("allure-report")]),t._v(" on the picture above). To view the report, use the "),n("code",[t._v("allure open")]),t._v(" command.")])]),t._v(" "),n("p",[t._v("Use this command if you need to save the report for future reference or for sharing it with colleagues.")]),t._v(" "),n("ul",[n("li",[n("code",[t._v("allure serve")]),t._v(" creates the same report as "),n("code",[t._v("allure generate")]),t._v(" but puts it into a temporary directory and starts a local web server configured to show this directory's contents. The command then automatically opens the main page of the report in a web browser.")])]),t._v(" "),n("p",[t._v("Use this command if you need to view the report for yourself and do not need to save it.")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/49.1bc4cc2f.js b/assets/js/49.1bc4cc2f.js new file mode 100644 index 00000000..6d98015c --- /dev/null +++ b/assets/js/49.1bc4cc2f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{679:function(t,e,s){"use strict";s.r(e);var n=s(7),r=Object(n.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[e("a",{attrs:{href:"https://www.cs.usfca.edu/~galles/visualization/Algorithms.html",target:"_blank",rel:"noopener noreferrer"}},[this._v("Data Structure Visualizations"),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/50.42fa1c56.js b/assets/js/50.42fa1c56.js new file mode 100644 index 00000000..8a6e0dc0 --- /dev/null +++ b/assets/js/50.42fa1c56.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{681:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"oracle"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#oracle"}},[t._v("#")]),t._v(" Oracle")]),t._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("com.oracle.jdbc"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("ojdbc8"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("version")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("12.2.0.1"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br")])]),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[t._v("jdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("oracle"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("thin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("@//server"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("port/serverName\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("h2",{attrs:{id:"mysql"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mysql"}},[t._v("#")]),t._v(" MySQL")]),t._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("mysql"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("mysql-connector-java"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br")])]),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("datasource")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n \t"),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" com.zaxxer.hikari.HikariDataSource\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("driver-class-name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" com.mysql.cj.jdbc.Driver\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" jdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("mysql"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("//192.168.1.12/testdb"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("?")]),t._v("useSSL=false"),a("span",{pre:!0,attrs:{class:"token important"}},[t._v("&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" root\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("123456")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br")])]),a("h2",{attrs:{id:"postgresql"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#postgresql"}},[t._v("#")]),t._v(" PostgreSQL")]),t._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("org.postgresql"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("postgresql"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br")])]),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("datasource")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" com.zaxxer.hikari.HikariDataSource\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("driver-class-name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" org.postgresql.Driver\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" jdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("postgresql"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("//192.168.1.25/testdb\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" postgres\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" \n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br")])]),a("h2",{attrs:{id:"h2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#h2"}},[t._v("#")]),t._v(" H2")]),t._v(" "),a("p",[a("a",{attrs:{href:"http://www.h2database.com/html/main.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://www.h2database.com/html/main.html"),a("OutboundLink")],1)]),t._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("dependency")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("groupId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("com.h2database"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("artifactId")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br")])]),a("div",{staticClass:"language-yaml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-yaml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("spring")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("datasource")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("type")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" com.zaxxer.hikari.HikariDataSource\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("driver-class-name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" org.h2.Driver\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 服务器模式")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" jdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("tcp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("//localhost/E"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("/app/data/testdb\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("username")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" root\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("password")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("123456")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("jpa")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("hibernate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("dialect")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" org.hibernate.dialect.H2Dialect\n \n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 内存模式")]),t._v("\njdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("mem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("")]),t._v("\njdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("mem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("test\njdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("mem"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("test;database_to_upper=false "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 设置表名和字段名是否区分大小写")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 以嵌入式(本地)连接方式连接H2数据库")]),t._v("\njdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("file"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("")]),t._v("\njdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("~/test    \t\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 连接位于用户目录下的test数据库")]),t._v("\njdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("file"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("/data/testdb\njdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("file"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("E"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("/app/data/testdb "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Windows only")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# 使用TCP/IP的服务器模式(远程连接)方式连接H2数据库(推荐)")]),t._v("\njdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("tcp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("//")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("/"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("")]),t._v("\njdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("tcp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("//localhost/~/testdb\njdbc"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("h2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("tcp"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("//localhost/E"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("/app/data/testdb\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br"),a("span",{staticClass:"line-number"},[t._v("22")]),a("br"),a("span",{staticClass:"line-number"},[t._v("23")]),a("br"),a("span",{staticClass:"line-number"},[t._v("24")]),a("br"),a("span",{staticClass:"line-number"},[t._v("25")]),a("br"),a("span",{staticClass:"line-number"},[t._v("26")]),a("br"),a("span",{staticClass:"line-number"},[t._v("27")]),a("br"),a("span",{staticClass:"line-number"},[t._v("28")]),a("br"),a("span",{staticClass:"line-number"},[t._v("29")]),a("br")])]),a("p",[t._v("H2 Console Sorry, remote connections ('webAllowOthers') are disabled on this server.的问题解决")]),t._v(" "),a("p",[t._v("修改src\\tools\\WEB-INF\\web.xml,原来注释掉的部分去掉注释即可。")]),t._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("init-param")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("param-name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("webAllowOthers"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("param-value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("init-param")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("param-name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("trace"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("param-value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br")])]),a("h2",{attrs:{id:"数据类型"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#数据类型"}},[t._v("#")]),t._v(" 数据类型")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("Java")]),t._v(" "),a("th",[t._v("java.sql.Types")]),t._v(" "),a("th",[t._v("Oracle")]),t._v(" "),a("th",[t._v("MySQL")]),t._v(" "),a("th",[t._v("PostgreSQL")]),t._v(" "),a("th",[t._v("H2")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("Boolean")]),t._v(" "),a("td",[t._v("BIT")]),t._v(" "),a("td",[t._v("BIT")]),t._v(" "),a("td"),t._v(" "),a("td",[t._v("boolean")]),t._v(" "),a("td",[t._v("BOOLEAN")])]),t._v(" "),a("tr",[a("td",[t._v("Byte")]),t._v(" "),a("td",[t._v("TINYINT")]),t._v(" "),a("td",[t._v("TINYINT")]),t._v(" "),a("td",[t._v("TINYINT")]),t._v(" "),a("td"),t._v(" "),a("td",[t._v("TINYINT")])]),t._v(" "),a("tr",[a("td",[t._v("Integer")]),t._v(" "),a("td",[t._v("SMALLINT")]),t._v(" "),a("td"),t._v(" "),a("td",[t._v("SMALLINT")]),t._v(" "),a("td",[t._v("smallint")]),t._v(" "),a("td",[t._v("SMALLINT")])]),t._v(" "),a("tr",[a("td",[t._v("Integer")]),t._v(" "),a("td",[t._v("INTEGER")]),t._v(" "),a("td",[t._v("INTEGER")]),t._v(" "),a("td",[t._v("INTEGER")]),t._v(" "),a("td",[t._v("integer")]),t._v(" "),a("td",[t._v("INTEGER")])]),t._v(" "),a("tr",[a("td",[t._v("Long")]),t._v(" "),a("td",[t._v("BIGINT")]),t._v(" "),a("td",[t._v("NUMBER(19,0)")]),t._v(" "),a("td",[t._v("BIGINT")]),t._v(" "),a("td",[t._v("bigint")]),t._v(" "),a("td",[t._v("BIGINT")])]),t._v(" "),a("tr",[a("td",[t._v("Double")]),t._v(" "),a("td",[t._v("FLOAT")]),t._v(" "),a("td"),t._v(" "),a("td"),t._v(" "),a("td"),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("Float")]),t._v(" "),a("td",[t._v("REAL")]),t._v(" "),a("td"),t._v(" "),a("td"),t._v(" "),a("td",[t._v("real")]),t._v(" "),a("td",[t._v("REAL")])]),t._v(" "),a("tr",[a("td",[t._v("Double")]),t._v(" "),a("td",[t._v("DOUBLE")]),t._v(" "),a("td"),t._v(" "),a("td"),t._v(" "),a("td",[t._v("double precision")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("BigDecimal")]),t._v(" "),a("td",[t._v("NUMERIC")]),t._v(" "),a("td",[t._v("NUMBER")]),t._v(" "),a("td"),t._v(" "),a("td",[t._v("numeric")]),t._v(" "),a("td",[t._v("NUMERIC")])]),t._v(" "),a("tr",[a("td",[t._v("BigDecimal")]),t._v(" "),a("td",[t._v("DECIMAL")]),t._v(" "),a("td"),t._v(" "),a("td"),t._v(" "),a("td",[t._v("decimal")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("String")]),t._v(" "),a("td",[t._v("CHAR")]),t._v(" "),a("td",[t._v("CHAR")]),t._v(" "),a("td",[t._v("CHAR")]),t._v(" "),a("td",[t._v("char")]),t._v(" "),a("td",[t._v("CHAR")])]),t._v(" "),a("tr",[a("td",[t._v("String")]),t._v(" "),a("td",[t._v("VARCHAR")]),t._v(" "),a("td",[t._v("VARCHAR2")]),t._v(" "),a("td",[t._v("VARCHAR")]),t._v(" "),a("td",[t._v("varchar")]),t._v(" "),a("td",[t._v("VARCHAR")])]),t._v(" "),a("tr",[a("td",[t._v("Date")]),t._v(" "),a("td",[t._v("DATE")]),t._v(" "),a("td",[t._v("DATE")]),t._v(" "),a("td",[t._v("DATE")]),t._v(" "),a("td",[t._v("date")]),t._v(" "),a("td",[t._v("DATE")])]),t._v(" "),a("tr",[a("td"),t._v(" "),a("td",[t._v("TIME")]),t._v(" "),a("td",[t._v("DATE")]),t._v(" "),a("td",[t._v("TIME")]),t._v(" "),a("td",[t._v("time")]),t._v(" "),a("td",[t._v("TIME")])]),t._v(" "),a("tr",[a("td"),t._v(" "),a("td",[t._v("TIMESTAMP")]),t._v(" "),a("td",[t._v("DATE")]),t._v(" "),a("td",[t._v("TIMESTAMP")]),t._v(" "),a("td",[t._v("timestamp")]),t._v(" "),a("td",[t._v("TIMESTAMP")])])])]),t._v(" "),a("p",[a("a",{attrs:{href:"https://www.w3cschool.cn/mysql/mysql-data-types.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("MySQL 数据类型_w3cschool"),a("OutboundLink")],1)]),t._v(" "),a("p",[a("a",{attrs:{href:"https://m.runoob.com/postgresql/postgresql-data-type.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("PostgreSQL 数据类型 | 菜鸟教程"),a("OutboundLink")],1)]),t._v(" "),a("p",[a("a",{attrs:{href:"http://www.h2database.com/html/datatypes.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://www.h2database.com/html/datatypes.html"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"数据库操作"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#数据库操作"}},[t._v("#")]),t._v(" 数据库操作")]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" db_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DROP")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" db_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br")])]),a("h2",{attrs:{id:"数据表操作"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#数据表操作"}},[t._v("#")]),t._v(" 数据表操作")]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TABLE")]),t._v(" table_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n column1 datatype "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIMARY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("KEY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n column2 datatype "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n column3 datatype "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n columnN datatype "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DROP")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TABLE")]),t._v(" table_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("-- SCHEMA逻辑分库")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SCHEMA")]),t._v(" schema_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("table_name "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("-- 删除一个为空的模式(其中的所有对象已经被删除)")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DROP")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SCHEMA")]),t._v(" schema_name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("-- 删除一个模式以及其中包含的所有对象")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DROP")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SCHEMA")]),t._v(" schema_name "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CASCADE")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br")])]),a("p",[t._v("示例:")]),t._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("-- MySQL")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TABLE")]),t._v(" sys_user"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("BIGINT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIMARY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("KEY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n nickname "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n username "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n password "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n is_enabled "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TINYINT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DEFAULT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n is_deleted "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TINYINT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DEFAULT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n gmt_create "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TIMESTAMP")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n gmt_modified "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TIMESTAMP")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("-- PostgreSQL")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TABLE")]),t._v(" sys_user"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("BIGINT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIMARY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("KEY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n nickname "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n username "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n password "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n is_enabled "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("BOOLEAN")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DEFAULT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n is_deleted "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("BOOLEAN")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DEFAULT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n gmt_create "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TIMESTAMP")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n gmt_modified "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TIMESTAMP")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("-- H2")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CREATE")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TABLE")]),t._v(" sys_user"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n id "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("BIGINT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIMARY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("KEY")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n nickname "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n username "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n password "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("VARCHAR")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n is_enabled "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("BOOLEAN")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DEFAULT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n is_deleted "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("BOOLEAN")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DEFAULT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n gmt_create "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TIMESTAMP")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n gmt_modified "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TIMESTAMP")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("NOT")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("NULL")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br"),a("span",{staticClass:"line-number"},[t._v("22")]),a("br"),a("span",{staticClass:"line-number"},[t._v("23")]),a("br"),a("span",{staticClass:"line-number"},[t._v("24")]),a("br"),a("span",{staticClass:"line-number"},[t._v("25")]),a("br"),a("span",{staticClass:"line-number"},[t._v("26")]),a("br"),a("span",{staticClass:"line-number"},[t._v("27")]),a("br"),a("span",{staticClass:"line-number"},[t._v("28")]),a("br"),a("span",{staticClass:"line-number"},[t._v("29")]),a("br"),a("span",{staticClass:"line-number"},[t._v("30")]),a("br"),a("span",{staticClass:"line-number"},[t._v("31")]),a("br"),a("span",{staticClass:"line-number"},[t._v("32")]),a("br"),a("span",{staticClass:"line-number"},[t._v("33")]),a("br"),a("span",{staticClass:"line-number"},[t._v("34")]),a("br"),a("span",{staticClass:"line-number"},[t._v("35")]),a("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/51.60aad37e.js b/assets/js/51.60aad37e.js new file mode 100644 index 00000000..acc1df4f --- /dev/null +++ b/assets/js/51.60aad37e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{685:function(s,t,a){"use strict";a.r(t);var e=a(7),n=Object(e.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h2",{attrs:{id:"在linux下安装postgresql"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#在linux下安装postgresql"}},[s._v("#")]),s._v(" 在Linux下安装PostgreSQL")]),s._v(" "),a("p",[a("a",{attrs:{href:"https://www.postgresql.org/download/linux/redhat/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://www.postgresql.org/download/linux/redhat/"),a("OutboundLink")],1)]),s._v(" "),a("p",[s._v("0、安装JDK11")]),s._v(" "),a("p",[s._v("1、下载安装包")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("2、安装postgresql")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y postgresql13-server\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("3、初始化数据库")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" /usr/pgsql-13/bin/postgresql-13-setup initdb\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("4、设置开机启动postgresql")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" postgresql-13\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("5、启动postgresql")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl start postgresql-13\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("6、检查postgresql是否运行")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 方式一:查看服务状态")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl status postgresql-13 \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 方式二:查postgres的进程信息")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("ps")]),s._v(" -ef "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" postgres\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 方式三:查postgres的端口号5432是否已经打开")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("netstat")]),s._v(" -tpnl "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("5432")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("p",[s._v("7、停止postgresql")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl stop postgresql-13\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl status postgresql-13 \n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("8、开启远程访问")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /var/lib/pgsql/13/data\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 8.1")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" postgresql.conf postgresql.conf.bak\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" postgresql.conf\n将 listen_addresses "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'localhost'")]),s._v(" 修改为 listen_addresses "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'*'")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 8.2")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" pg_hba.conf pg_hba.conf.bak\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" pg_hba.conf\n增加一行访问规则,表示允许任何一个客户端使用正确的用户名和密码访问postgresql \n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("host")]),s._v(" all all "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("0.0")]),s._v(".0.0/0 trust\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br")])]),a("p",[s._v("9、启动postgresql")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl start postgresql-13\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl status postgresql-13\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("10、使用"),a("a",{attrs:{href:"https://dbeaver.io/download/",target:"_blank",rel:"noopener noreferrer"}},[s._v("DBeaver"),a("OutboundLink")],1),s._v("、"),a("a",{attrs:{href:"https://www.pgadmin.org/",target:"_blank",rel:"noopener noreferrer"}},[s._v("pgAdmin"),a("OutboundLink")],1),s._v("等客户端连接postgresql")]),s._v(" "),a("p",[s._v("postgresql默认用户:postgres,密码:无")]),s._v(" "),a("p",[s._v("pgAdmin初始主密码:123456")]),s._v(" "),a("p",[s._v("11、其他命令")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重启postgresql-13")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl restart postgresql-13\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查 PostgreSQL 是否已经安装")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -qa "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" postgres \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查 PostgreSQL 安装位置")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -qal "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" postgres\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("h2",{attrs:{id:"postgresql-使用"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#postgresql-使用"}},[s._v("#")]),s._v(" PostgreSQL 使用")]),s._v(" "),a("p",[a("a",{attrs:{href:"https://m.runoob.com/postgresql/",target:"_blank",rel:"noopener noreferrer"}},[s._v("PostgreSQL 教程 | 菜鸟教程"),a("OutboundLink")],1)]),s._v(" "),a("p",[s._v("切换到 postgres 用户来开启命令行工具:")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" -i -u postgres\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("进入到 PostgreSQL 的控制台:")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("psql -h "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("服务器地址"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" -p "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("端口号"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" -d "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("数据库名"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("-U 用户名"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\npsql\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("1、数据库操作")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 列出数据库")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("postgres")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# \\l")]),s._v("\n List of databases\n Name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" Owner "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" Encoding "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" Collate "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" Ctype "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" Access privileges \n-----------+----------+----------+-------------+-------------+-----------------------\n postgres "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" postgres "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" UTF8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" en_US.UTF-8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" en_US.UTF-8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" \n sonarqube "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" sonar "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" UTF8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" en_US.UTF-8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" en_US.UTF-8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" \n template0 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" postgres "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" UTF8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" en_US.UTF-8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" en_US.UTF-8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("c/postgres +\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("postgres")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("CTc/postgres\n template1 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" postgres "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" UTF8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" en_US.UTF-8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" en_US.UTF-8 "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("c/postgres +\n "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("postgres")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("CTc/postgres\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("4")]),s._v(" rows"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 切换数据库")]),s._v("\npostgres-"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# \\c testdb")]),s._v("\nYou are now connected to database "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"testdb"')]),s._v(" as user "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"postgres"')]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\ntestdb-"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br")])]),a("p",[s._v("2、数据表操作")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 列出当前数据库所有表")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("d\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看表格信息")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("d tablename\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br")])]),a("p",[s._v("其他操作:")]),s._v(" "),a("div",{staticClass:"language-sql line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-sql"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- 查看pgsql版本")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("SELECT")]),s._v(" version"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- 查看用户名和密码")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("SELECT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("FROM")]),s._v(" pg_authid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- 获取服务器上所有数据库信息")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("SELECT")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("FROM")]),s._v(" pg_database "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ORDER")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BY")]),s._v(" datname"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- 得到当前db中所有表的信息(pg_tables是系统视图)")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("select")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("*")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" pg_tables "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ORDER")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("BY")]),s._v(" schemaname"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("-- 断开连接到sonar数据库上的所有链接")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("SELECT")]),s._v(" pg_terminate_backend"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("pg_stat_activity"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("pid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("FROM")]),s._v(" pg_stat_activity\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("WHERE")]),s._v(" datname"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'sonar'")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("AND")]),s._v(" pid"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<>")]),s._v("pg_backend_pid"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br")])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/53.446c4e43.js b/assets/js/53.446c4e43.js new file mode 100644 index 00000000..03c0429f --- /dev/null +++ b/assets/js/53.446c4e43.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{684:function(t,e,n){"use strict";n.r(e);var s=n(7),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/55.62629b27.js b/assets/js/55.62629b27.js new file mode 100644 index 00000000..2156a766 --- /dev/null +++ b/assets/js/55.62629b27.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{689:function(t,v,_){"use strict";_.r(v);var d=_(7),e=Object(d.a)({},(function(){var t=this,v=t.$createElement,_=t._self._c||v;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("table",[_("thead",[_("tr",[_("th"),t._v(" "),_("th",[t._v("BAT")]),t._v(" "),_("th",[t._v("Shell")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("显示信息")]),t._v(" "),_("td",[_("code",[t._v("echo 提示信息")]),t._v(":输出提示信息"),_("br"),_("code",[t._v("@echo 提示信息")]),t._v(":关闭回显输出提示信息"),_("br"),_("code",[t._v("@echo off")]),t._v(":关闭回显"),_("br"),_("code",[t._v("@echo on")]),t._v(":打开回显")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("注释语句")]),t._v(" "),_("td",[_("code",[t._v("rem 注释")]),t._v(":rem(remark),注释")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("切换目录")]),t._v(" "),_("td",[_("code",[t._v("cd 目录")])]),t._v(" "),_("td",[_("code",[t._v("cd 目录")])])]),t._v(" "),_("tr",[_("td",[t._v("创建目录")]),t._v(" "),_("td"),t._v(" "),_("td",[_("code",[t._v("mkdir 目录")]),_("br"),_("code",[t._v("mkdir -p 多级目录")])])]),t._v(" "),_("tr",[_("td",[t._v("删除目录")]),t._v(" "),_("td",[_("code",[t._v("rd 目录")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[t._v("列文件名")]),t._v(" "),_("td",[_("code",[t._v("dir")])]),t._v(" "),_("td",[_("code",[t._v("ls")]),_("br"),_("code",[t._v("ls -l")])])]),t._v(" "),_("tr",[_("td"),t._v(" "),_("td"),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td"),t._v(" "),_("td"),t._v(" "),_("td")])])])])}),[],!1,null,null,null);v.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/56.f3cb46a9.js b/assets/js/56.f3cb46a9.js new file mode 100644 index 00000000..37aab3b4 --- /dev/null +++ b/assets/js/56.f3cb46a9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{692:function(s,a,n){"use strict";n.r(a);var t=n(7),e=Object(t.a)({},(function(){var s=this,a=s.$createElement,n=s._self._c||a;return n("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[n("p",[n("a",{attrs:{href:"https://docs.docker.com/",target:"_blank",rel:"noopener noreferrer"}},[s._v("docker docs"),n("OutboundLink")],1)]),s._v(" "),n("p",[n("a",{attrs:{href:"https://www.runoob.com/docker/docker-tutorial.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("Docker教程 | 菜鸟教程"),n("OutboundLink")],1)]),s._v(" "),n("h2",{attrs:{id:"安装-升级docker客户端"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#安装-升级docker客户端"}},[s._v("#")]),s._v(" 安装/升级Docker客户端")]),s._v(" "),n("h3",{attrs:{id:"卸载docker"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#卸载docker"}},[s._v("#")]),s._v(" 卸载docker")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# yum remove docker*")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum remove docker "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n docker-client "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n docker-client-latest "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n docker-common "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n docker-latest "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n docker-latest-logrotate "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n docker-logrotate "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n docker-engine\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("h3",{attrs:{id:"安装docker"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#安装docker"}},[s._v("#")]),s._v(" 安装docker")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Step 1: 安装必要的一些系统工具")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y yum-utils device-mapper-persistent-data lvm2\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Step 2: 添加软件源信息")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Step 3: 更新并安装 Docker-CE")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum makecache fast\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum -y "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" docker-ce\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Step 4: 开启Docker服务")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" docker start\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 设置开机启动")]),s._v("\nsystemctl "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" docker\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# step 5:检查是否安装成功")]),s._v("\ndocker version\ndocker into\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br")])]),n("h3",{attrs:{id:"配置镜像加速器"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#配置镜像加速器"}},[s._v("#")]),s._v(" 配置镜像加速器")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" -p /etc/docker\n\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("tee")]),s._v(" /etc/docker/daemon.json "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<<-")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('\'EOF\'\n{\n "registry-mirrors": ["https://4uv4xvt5.mirror.aliyuncs.com"]\n}\nEOF')]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl daemon-reload\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" systemctl restart docker\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br")])]),n("p",[n("a",{attrs:{href:"https://docs.docker.com/engine/install/centos/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.docker.com/engine/install/centos/"),n("OutboundLink")],1)]),s._v(" "),n("p",[n("a",{attrs:{href:"https://developer.aliyun.com/article/110806",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://developer.aliyun.com/article/110806"),n("OutboundLink")],1)]),s._v(" "),n("p",[n("a",{attrs:{href:"https://help.aliyun.com/document_detail/60750.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://help.aliyun.com/document_detail/60750.html"),n("OutboundLink")],1)]),s._v(" "),n("h2",{attrs:{id:"docker-cli"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-cli"}},[s._v("#")]),s._v(" Docker CLI")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://docs.docker.com/reference/",target:"_blank",rel:"noopener noreferrer"}},[s._v("docker docs reference"),n("OutboundLink")],1)]),s._v(" "),n("p",[n("a",{attrs:{href:"https://registry.hub.docker.com/",target:"_blank",rel:"noopener noreferrer"}},[s._v("docker hub"),n("OutboundLink")],1)]),s._v(" "),n("h3",{attrs:{id:"docker-search-pull-images-rmi"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-search-pull-images-rmi"}},[s._v("#")]),s._v(" docker search/pull/images/rmi")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 搜索镜像")]),s._v("\ndocker search "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("OPTIONS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("TERM")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 拉取镜像")]),s._v("\ndocker pull NAME"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(":TAG"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 镜像列表")]),s._v("\ndocker images\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除镜像")]),s._v("\ndocker rmi "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("OPTIONS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" IMAGE "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("IMAGE"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br")])]),n("h3",{attrs:{id:"docker-inspect"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-inspect"}},[s._v("#")]),s._v(" docker inspect")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker inspect "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("OPTIONS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" NAME"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("ID "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("NAME"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("ID"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\ndocker inspect 40c68ed3a4d2\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br")])]),n("h3",{attrs:{id:"docker-build-tag-push"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-build-tag-push"}},[s._v("#")]),s._v(" docker build/tag/push")]),s._v(" "),n("h4",{attrs:{id:"docker-build"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-build"}},[s._v("#")]),s._v(" docker build")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker build "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("OPTIONS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("PATH")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" URL "),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" -\ndocker build -t runoob/centos:6.7 -f Dockerfile "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("table",[n("thead",[n("tr",[n("th",[s._v("Name, shorthand")]),s._v(" "),n("th",[s._v("Default")]),s._v(" "),n("th",[s._v("Description")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[n("code",[s._v("--file")]),s._v(" , "),n("code",[s._v("-f")])]),s._v(" "),n("td"),s._v(" "),n("td",[s._v("Name of the Dockerfile (Default is 'PATH/Dockerfile')")])]),s._v(" "),n("tr",[n("td",[n("code",[s._v("--tag")]),s._v(" , "),n("code",[s._v("-t")])]),s._v(" "),n("td"),s._v(" "),n("td",[s._v("Name and optionally a tag in the 'name:tag' format")])])])]),s._v(" "),n("h4",{attrs:{id:"docker-tag"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-tag"}},[s._v("#")]),s._v(" docker tag")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker tag SOURCE_IMAGE"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(":TAG"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" TARGET_IMAGE"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(":TAG"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\ndocker tag 860c279d2fec runoob/centos:dev\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("h4",{attrs:{id:"docker-push"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-push"}},[s._v("#")]),s._v(" docker push")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker push "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("OPTIONS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" NAME"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(":TAG"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("h3",{attrs:{id:"docker-cp"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-cp"}},[s._v("#")]),s._v(" docker cp")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("OPTIONS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" CONTAINER:SRC_PATH DEST_PATH\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("p",[s._v("The docker cp utility copies the contents of SRC_PATH to the DEST_PATH. You can copy from the container’s file system to the local machine or the reverse, from the local filesystem to the container.")]),s._v(" "),n("p",[s._v("The cp command behaves like the Unix cp -a command in that directories are copied recursively with permissions preserved if possible.")]),s._v(" "),n("p",[s._v("SRC_PATH specifies a file\nDEST_PATH does not exist\nthe file is saved to a file created at DEST_PATH\nDEST_PATH exists and is a file\nthe destination is overwritten with the source file’s contents\nDEST_PATH exists and is a directory\nthe file is copied into this directory using the basename from SRC_PATH\nSRC_PATH specifies a directory\nDEST_PATH does not exist\nDEST_PATH is created as a directory and the contents of the source directory are copied into this directory")]),s._v(" "),n("h3",{attrs:{id:"docker-network"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-network"}},[s._v("#")]),s._v(" docker network")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker network COMMAND\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 为已运行容器移除网络")]),s._v("\ndocker network disconnect my-network 5d61a524ddd0\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 移除网络")]),s._v("\ndocker network "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("rm")]),s._v(" my-network\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 创建网络")]),s._v("\ndocker network create -d bridge testnet\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 为已运行容器添加网络")]),s._v("\ndocker network connect --alias testnet-mysql testnet 5d61a524ddd0\ndocker network connect --alias testnet-nacos testnet 919589ca7fd1\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br")])]),n("table",[n("thead",[n("tr",[n("th",[s._v("Command")]),s._v(" "),n("th",[s._v("Description")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[n("a",{attrs:{href:"https://docs.docker.com/engine/reference/commandline/network_create/",target:"_blank",rel:"noopener noreferrer"}},[s._v("docker network create"),n("OutboundLink")],1)]),s._v(" "),n("td",[s._v("Create a network"),n("br"),n("code",[s._v("docker network create [OPTIONS] NETWORK")])])]),s._v(" "),n("tr",[n("td",[n("a",{attrs:{href:"https://docs.docker.com/engine/reference/commandline/network_rm/",target:"_blank",rel:"noopener noreferrer"}},[s._v("docker network rm"),n("OutboundLink")],1)]),s._v(" "),n("td",[s._v("Remove one or more networks")])]),s._v(" "),n("tr",[n("td",[n("a",{attrs:{href:"https://docs.docker.com/engine/reference/commandline/network_prune/",target:"_blank",rel:"noopener noreferrer"}},[s._v("docker network prune"),n("OutboundLink")],1)]),s._v(" "),n("td",[s._v("Remove all unused networks")])]),s._v(" "),n("tr",[n("td",[n("a",{attrs:{href:"https://docs.docker.com/engine/reference/commandline/network_connect/",target:"_blank",rel:"noopener noreferrer"}},[s._v("docker network connect"),n("OutboundLink")],1)]),s._v(" "),n("td",[s._v("Connect a container to a network")])]),s._v(" "),n("tr",[n("td",[n("a",{attrs:{href:"https://docs.docker.com/engine/reference/commandline/network_disconnect/",target:"_blank",rel:"noopener noreferrer"}},[s._v("docker network disconnect"),n("OutboundLink")],1)]),s._v(" "),n("td",[s._v("Disconnect a container from a network")])]),s._v(" "),n("tr",[n("td",[n("a",{attrs:{href:"https://docs.docker.com/engine/reference/commandline/network_ls/",target:"_blank",rel:"noopener noreferrer"}},[s._v("docker network ls"),n("OutboundLink")],1)]),s._v(" "),n("td",[s._v("List networks")])]),s._v(" "),n("tr",[n("td",[n("a",{attrs:{href:"https://docs.docker.com/engine/reference/commandline/network_inspect/",target:"_blank",rel:"noopener noreferrer"}},[s._v("docker network inspect"),n("OutboundLink")],1)]),s._v(" "),n("td",[s._v("Display detailed information on one or more networks")])])])]),s._v(" "),n("h3",{attrs:{id:"docker-run"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-run"}},[s._v("#")]),s._v(" docker run")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker run "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("OPTIONS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" IMAGE "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("COMMAND"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("ARG"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\ndocker run hello-world\ndocker run -i -t ubuntu:latest /bin/bash \ndocker run -it ubuntu:latest /bin/bash\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("table",[n("thead",[n("tr",[n("th",[s._v("Option")]),s._v(" "),n("th",{staticStyle:{"text-align":"left"}},[s._v("Description")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[s._v("--name")]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("指定容器名称")])]),s._v(" "),n("tr",[n("td",[s._v("-i")]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("交互式操作")])]),s._v(" "),n("tr",[n("td",[s._v("-t")]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("分配伪终端")])]),s._v(" "),n("tr",[n("td",[s._v("-e")]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("Set environment variables")])]),s._v(" "),n("tr",[n("td",[s._v("-p")]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("Publish or expose port")])]),s._v(" "),n("tr",[n("td",[s._v("-v")]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("The -v flag mounts the current working directory into the container. "),n("br"),s._v("When the host directory of a bind-mounted volume doesn’t exist, "),n("br"),s._v("Docker will automatically create this directory on the host for you. "),n("br"),s._v("In the example above, "),n("br"),s._v("Docker will create the /doesnt/exist folder before starting your container.")])]),s._v(" "),n("tr",[n("td",[n("a",{attrs:{href:"https://docs.docker.com/engine/reference/commandline/run/#connect-a-container-to-a-network---network",target:"_blank",rel:"noopener noreferrer"}},[s._v("--network"),n("OutboundLink")],1)]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("Connect a container to a network")])]),s._v(" "),n("tr",[n("td",[s._v("--network-alias")]),s._v(" "),n("td",{staticStyle:{"text-align":"left"}},[s._v("Add network-scoped alias for the container")])])])]),s._v(" "),n("h3",{attrs:{id:"docker-exec"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-exec"}},[s._v("#")]),s._v(" docker exec")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exec")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("OPTIONS"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" CONTAINER COMMAND "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("ARG"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("table",[n("thead",[n("tr",[n("th",[s._v("Name, shorthand")]),s._v(" "),n("th",[s._v("Description")])])]),s._v(" "),n("tbody",[n("tr",[n("td",[n("code",[s._v("--interactive")]),s._v(" , "),n("code",[s._v("-i")])]),s._v(" "),n("td",[s._v("Keep STDIN open even if not attached")])]),s._v(" "),n("tr",[n("td",[n("code",[s._v("--tty")]),s._v(" , "),n("code",[s._v("-t")])]),s._v(" "),n("td",[s._v("Allocate a pseudo-TTY")])])])]),s._v(" "),n("h3",{attrs:{id:"docker-ps-start-stop-rm-logs"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-ps-start-stop-rm-logs"}},[s._v("#")]),s._v(" docker ps/start/stop/rm/logs")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 列出正在运行的容器")]),s._v("\ndocker "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ps")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 列出全部容器")]),s._v("\ndocker "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("ps")]),s._v(" -a\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重启容器")]),s._v("\ndocker start container_id\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 停止容器")]),s._v("\ndocker stop container_id\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 删除容器")]),s._v("\ndocker "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("rm")]),s._v(" container_id\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 强制删除容器")]),s._v("\ndocker "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("rm")]),s._v(" -f container_id\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看容器日志")]),s._v("\ndocker logs container_id/container_name\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br")])]),n("h3",{attrs:{id:"docker-container-update"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-container-update"}},[s._v("#")]),s._v(" docker container update")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker container update --restart"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("always container_id/container_name\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br")])]),n("h2",{attrs:{id:"dockerfile"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#dockerfile"}},[s._v("#")]),s._v(" Dockerfile")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://docs.docker.com/engine/reference/builder/",target:"_blank",rel:"noopener noreferrer"}},[s._v("Dockerfile"),n("OutboundLink")],1),s._v(" 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。")]),s._v(" "),n("div",{staticClass:"language-dockerfile line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-dockerfile"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 指定基础镜像")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("FROM")]),s._v(" image[:tag]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 为镜像添加元数据")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("LABEL")]),s._v(" = = = ...")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 设置环境变量,在后续指令中可通过 $key 引用")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ENV")]),s._v(" key=value [key2=value2 ...]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 与 ENV 作用一致,但作用域不同")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ARG")]),s._v(" key=value")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 暴露端口号")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("EXPOSE")]),s._v(" [/...]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 卷挂载")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VOLUME")]),s._v(" ["),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/var/log/"')]),s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VOLUME")]),s._v(" /var/log")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("VOLUME")]),s._v(" /var/log /var/db")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# WORKDIR 指令为 Dockerfile 中跟随它的任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录。WORKDIR 指令可以在 Dockerfile 中多次使用。 如果提供了相对路径,它将相对于前一个 WORKDIR 指令的路径。")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("WORKDIR")]),s._v(" /path/to/workdir")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 从上下文目录中复制文件或者目录到容器里指定路径,目标路径不存在的话,会自动创建")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COPY")]),s._v(" src dest")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 与 COPY 类似,同样需求下,官方推荐使用 COPY")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ADD")]),s._v(" src dest")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# shell 格式")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在Linux上等同于:/bin/sh -c command")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在Windows上等同于:cmd /S /C command")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("RUN")]),s._v(" command")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# exec 格式, 官方推荐")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CMD")]),s._v(" ["),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"executable"')]),s._v(","),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"param1"')]),s._v(","),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"param2"')]),s._v("]")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 为 ENTRYPOINT 设置默认值")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("CMD")]),s._v(" ["),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"param1"')]),s._v(","),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"param2"')]),s._v("]")]),s._v("\n\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("ENTRYPOINT")]),s._v(" ["),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"executable"')]),s._v(", "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"param1"')]),s._v(", "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"param2"')]),s._v("]")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br")])]),n("h3",{attrs:{id:"run、cmd和entrypoint异同点"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#run、cmd和entrypoint异同点"}},[s._v("#")]),s._v(" RUN、CMD和ENTRYPOINT异同点")]),s._v(" "),n("p",[s._v("相同点:")]),s._v(" "),n("ul",[n("li",[s._v("三者都是用于运行程序。")])]),s._v(" "),n("p",[s._v("不同点:")]),s._v(" "),n("ul",[n("li",[s._v("执行时机不同。RUN是在 docker build 时执行的,CMD和ENTRYPOINT是在 docker run 时执行的。")]),s._v(" "),n("li",[s._v("指令个数不同。如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。")])]),s._v(" "),n("h3",{attrs:{id:"copy和add"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#copy和add"}},[s._v("#")]),s._v(" COPY和ADD")]),s._v(" "),n("h3",{attrs:{id:"env和arg"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#env和arg"}},[s._v("#")]),s._v(" ENV和ARG")]),s._v(" "),n("p",[s._v("ENV 设置的环境变量会存在于生成的镜像中,可以使用 docker run --env key=value 更改它们,可以使用 docker inspect 查看它们。")]),s._v(" "),n("p",[s._v("ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,可以用 --build-arg <参数名>=<值> 来覆盖。")]),s._v(" "),n("h2",{attrs:{id:"docker-compose"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-compose"}},[s._v("#")]),s._v(" Docker Compose")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://docs.docker.com/compose/",target:"_blank",rel:"noopener noreferrer"}},[s._v("Compose"),n("OutboundLink")],1),s._v(" 用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。")]),s._v(" "),n("p",[s._v("在"),n("a",{attrs:{href:"https://github.com/docker/compose/releases",target:"_blank",rel:"noopener noreferrer"}},[s._v("这里"),n("OutboundLink")],1),s._v("下载 Docker Compose 文件,放在 /usr/local/bin 目录下")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重命名")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("mv")]),s._v(" docker-compose-linux-x86_64 docker-compose\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 添加可执行权限")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" +x /usr/local/bin/docker-compose\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查是否安装成功")]),s._v("\ndocker-compose --version\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("h3",{attrs:{id:"编写-docker-compose-yml"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#编写-docker-compose-yml"}},[s._v("#")]),s._v(" 编写 docker-compose.yml")]),s._v(" "),n("h3",{attrs:{id:"运行应用"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#运行应用"}},[s._v("#")]),s._v(" 运行应用")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker-compose up\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 后台启动")]),s._v("\ndocker-compose up -d\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 指定配置文件 + 后台启动")]),s._v("\ndocker-compose -f /path/to/docker-compose.yml up -d\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br")])]),n("p",[n("a",{attrs:{href:"https://www.runoob.com/docker/docker-compose.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("Docker Compose | 菜鸟教程"),n("OutboundLink")],1)]),s._v(" "),n("h2",{attrs:{id:"docker-安装-nginx"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-安装-nginx"}},[s._v("#")]),s._v(" Docker 安装 Nginx")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 拉取镜像")]),s._v("\ndocker pull nginx\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 运行容器")]),s._v("\ndocker run --name my-nginx "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v(":80 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d nginx\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 拷贝文件")]),s._v("\ndocker "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" a7a715f67e1e:/etc/nginx/nginx.conf /my/nginx/nginx.conf\ndocker "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" a7a715f67e1e:/usr/share/nginx/html /my/nginx\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 运行容器")]),s._v("\ndocker run --name my-nginx "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-v /my/nginx/nginx.conf:/etc/nginx/nginx.conf:ro "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-v /my/nginx/html:/usr/share/nginx/html:ro "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v(":80 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d nginx\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br")])]),n("h2",{attrs:{id:"docker-安装-oracle"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-安装-oracle"}},[s._v("#")]),s._v(" Docker 安装 Oracle")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://www.cnblogs.com/xiaoyuxixi/p/13739596.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://www.cnblogs.com/xiaoyuxixi/p/13739596.html"),n("OutboundLink")],1)]),s._v(" "),n("p",[n("a",{attrs:{href:"https://github.com/oracle/docker-images",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://github.com/oracle/docker-images"),n("OutboundLink")],1)]),s._v(" "),n("h2",{attrs:{id:"docker-安装-mysql"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-安装-mysql"}},[s._v("#")]),s._v(" Docker 安装 MySQL")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 拉取镜像")]),s._v("\ndocker pull mysql\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 运行容器")]),s._v("\ndocker run --name my-mysql "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-e "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("MYSQL_ROOT_PASSWORD")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("123")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v(" \n--network testnet "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--network-alias testnet-mysql "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d mysql\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 创建目录")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" -p /my/mysql\n"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /my/mysql\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" conf\n"),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" data\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 运行容器")]),s._v("\ndocker run --name my-mysql "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-e "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("MYSQL_ROOT_PASSWORD")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("123")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--network testnet "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--network-alias testnet-mysql "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-v /my/mysql/conf:/etc/mysql/conf.d "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-v /my/mysql/data:/var/lib/mysql "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("3306")]),s._v(":3306 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("33060")]),s._v(":33060 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--restart"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("always "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d mysql\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 进入容器")]),s._v("\ndocker "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exec")]),s._v(" -it my-mysql "),n("span",{pre:!0,attrs:{class:"token function"}},[s._v("bash")]),s._v("\nmysql -h "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1 -u root -p\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br")])]),n("h2",{attrs:{id:"docker-安装-redis"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-安装-redis"}},[s._v("#")]),s._v(" Docker 安装 Redis")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 拉取镜像")]),s._v("\ndocker pull redis:6.2.6\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 运行容器")]),s._v("\ndocker run --name my-redis "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--network testnet "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--network-alias testnet-redis "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v(":6379 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d redis:6.2.6 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\nredis-server "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--save "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("60")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--restart"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("always "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--loglevel warning\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 进入容器")]),s._v("\ndocker "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exec")]),s._v(" -it my-redis redis-cli -h testnet-nacos -p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br")])]),n("h2",{attrs:{id:"docker-安装-elasticsearch"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-安装-elasticsearch"}},[s._v("#")]),s._v(" Docker 安装 ElasticSearch")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 拉取镜像")]),s._v("\ndocker pull elasticsearch:6.8.20\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 运行容器")]),s._v("\ndocker run -d "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--name my-es "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--net testnet "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--net-alias testnet-es "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("9200")]),s._v(":9200 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("9300")]),s._v(":9300 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-e "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"discovery.type=single-node"')]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\nelasticsearch:6.8.20\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br")])]),n("h2",{attrs:{id:"docker-安装-fastdfs"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-安装-fastdfs"}},[s._v("#")]),s._v(" Docker 安装 FastDFS")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://registry.hub.docker.com/r/season/fastdfs",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://registry.hub.docker.com/r/season/fastdfs"),n("OutboundLink")],1)]),s._v(" "),n("h2",{attrs:{id:"docker-安装-naco"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#docker-安装-naco"}},[s._v("#")]),s._v(" Docker 安装 Naco")]),s._v(" "),n("p",[n("a",{attrs:{href:"https://nacos.io/zh-cn/docs/quick-start-docker.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://nacos.io/zh-cn/docs/quick-start-docker.html"),n("OutboundLink")],1)]),s._v(" "),n("p",[s._v("修改 example/standalone-mysql-8.yaml up")]),s._v(" "),n("div",{staticClass:"language-yaml line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-yaml"}},[n("code",[n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("version")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"2"')]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("services")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("nacos")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("image")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" nacos/nacos"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("server"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("$"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("NACOS_VERSION"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("container_name")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" my"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("nacos\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("env_file")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" ../env/nacos"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("standlone"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("mysql.env\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("volumes")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" ./standalone"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("logs/"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("/home/nacos/logs\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" ./init.d/custom.properties"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("/home/nacos/init.d/custom.properties\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("ports")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"8848:8848"')]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"9848:9848"')]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"9849:9849"')]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"9555:9555"')]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("restart")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" always\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("networks")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testnet")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("aliases")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v(" testnet"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("-")]),s._v("nacos \n"),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("networks")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("default")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("external")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("name")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" testnet\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("testnet")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v("\n "),n("span",{pre:!0,attrs:{class:"token key atrule"}},[s._v("external")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(":")]),s._v(" "),n("span",{pre:!0,attrs:{class:"token boolean important"}},[s._v("true")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br")])]),n("p",[s._v("修改 env/nacos-standlone-mysql.env")]),s._v(" "),n("div",{staticClass:"language-env line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[s._v("PREFER_HOST_MODE=testnet-nacos\nMODE=standalone\nSPRING_DATASOURCE_PLATFORM=mysql\nMYSQL_SERVICE_HOST=testnet-mysql\nMYSQL_SERVICE_DB_NAME=ry-config\nMYSQL_SERVICE_PORT=3306\nMYSQL_SERVICE_USER=root\nMYSQL_SERVICE_PASSWORD=123\nMYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br")])]),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /my/nacos/nacos-docker\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动容器")]),s._v("\ndocker-compose -f example/standalone-mysql-8.yaml up -d\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 实时输出日志")]),s._v("\ndocker logs -f dffd8a78274c\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("h2",{attrs:{id:"云部署"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#云部署"}},[s._v("#")]),s._v(" 云部署")]),s._v(" "),n("p",[s._v("登录阿里云 Docker Registry")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker login --username"),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("maiam妹 registry.cn-shenzhen.aliyuncs.com\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# docker login --username=maiam妹 registry-vpc.cn-shenzhen.aliyuncs.com")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("h3",{attrs:{id:"个人博客"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#个人博客"}},[s._v("#")]),s._v(" 个人博客")]),s._v(" "),n("p",[s._v("Dockerfile")]),s._v(" "),n("div",{staticClass:"language-dockerfile line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-dockerfile"}},[n("code",[n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("FROM")]),s._v(" nginx:1.20")]),s._v("\n"),n("span",{pre:!0,attrs:{class:"token instruction"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("COPY")]),s._v(" html /usr/share/nginx/html")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br")])]),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[s._v("unzip")]),s._v(" maiaimei.gitxx.io.zip -d html\n\ndocker rmi blog:1.0-SNAPSHOT\ndocker rmi registry.cn-shenzhen.aliyuncs.com/maiaimei/blog:1.0-SNAPSHOT\n\ndocker build -t blog:1.0-SNAPSHOT -f Dockerfile "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\n\ndocker tag blog:1.0-SNAPSHOT registry.cn-shenzhen.aliyuncs.com/maiaimei/blog:1.0-SNAPSHOT\n\ndocker push registry.cn-shenzhen.aliyuncs.com/maiaimei/blog:1.0-SNAPSHOT\n\ndocker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/blog:1.0-SNAPSHOT\n\ndocker run --name blog -p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(":80 -d blog:1.0-SNAPSHOT\ndocker run --name blog -p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(":80 -d registry.cn-shenzhen.aliyuncs.com/maiaimei/blog:1.0-SNAPSHOT\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br")])]),n("h3",{attrs:{id:"若依微服务"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#若依微服务"}},[s._v("#")]),s._v(" 若依微服务")]),s._v(" "),n("h4",{attrs:{id:"构建镜像"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#构建镜像"}},[s._v("#")]),s._v(" 构建镜像")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker build -t ruoyi-system:3.2.0 -f Dockerfile "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\ndocker build -t ruoyi-file:3.2.0 -f Dockerfile "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\ndocker build -t ruoyi-job:3.2.0 -f Dockerfile "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\ndocker build -t ruoyi-auth:3.2.0 -f Dockerfile "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\ndocker build -t ruoyi-gateway:3.2.0 -f Dockerfile "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\ndocker build -t ruoyi-ui:3.2.0 -f Dockerfile "),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("h4",{attrs:{id:"打标签"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#打标签"}},[s._v("#")]),s._v(" 打标签")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker tag ea7307d2615f registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-system:3.2.0\ndocker tag 62bcb37e91e8 registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-file:3.2.0\ndocker tag 32fdb2de69b5 registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-job:3.2.0\ndocker tag 6caf13e8369d registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-auth:3.2.0\ndocker tag c9c352c6b90a registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-gateway:3.2.0\ndocker tag 3ca7aa53ca76 registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-ui:3.2.0\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("h4",{attrs:{id:"推送镜像"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#推送镜像"}},[s._v("#")]),s._v(" 推送镜像")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-system:3.2.0\ndocker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-file:3.2.0\ndocker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-job:3.2.0\ndocker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-auth:3.2.0\ndocker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-gateway:3.2.0\ndocker push registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-ui:3.2.0\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("h4",{attrs:{id:"拉取镜像"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#拉取镜像"}},[s._v("#")]),s._v(" 拉取镜像")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-system:3.2.0\ndocker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-file:3.2.0\ndocker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-job:3.2.0\ndocker pull registry.cn-shenzhen.aliyuncs.comm/maiaimei/ruoyi-auth:3.2.0\ndocker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-gateway:3.2.0\ndocker pull registry.cn-shenzhen.aliyuncs.com/maiaimei/ruoyi-ui:3.2.0\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br")])]),n("h4",{attrs:{id:"运行容器"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#运行容器"}},[s._v("#")]),s._v(" 运行容器")]),s._v(" "),n("div",{staticClass:"language-bash line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-bash"}},[n("code",[s._v("docker run "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--name ruoyi-system "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-e "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("JAVA_PARAMS")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"-Dserver.port=9201 -Dfile.encoding=utf8 -DNACOS_DISCOVERY_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_NAMESPACE=test -Dspring.profiles.active=test"')]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("9201")]),s._v(":9201 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\nruoyi-system:3.2.0\n\ndocker run "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--name ruoyi-file "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-e "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("JAVA_PARAMS")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"-Dserver.port=9300 -Dfile.encoding=utf8 -DNACOS_DISCOVERY_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_NAMESPACE=test -Dspring.profiles.active=test"')]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("9300")]),s._v(":9300 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\nruoyi-file:3.2.0\n\ndocker run "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--name ruoyi-job "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-e "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("JAVA_PARAMS")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"-Dserver.port=9203 -Dfile.encoding=utf8 -DNACOS_DISCOVERY_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_NAMESPACE=test -Dspring.profiles.active=test"')]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("9203")]),s._v(":9203 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\nruoyi-job:3.2.0\n\ndocker run "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--name ruoyi-auth "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-e "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("JAVA_PARAMS")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"-Dserver.port=9200 -Dfile.encoding=utf8 -DNACOS_DISCOVERY_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_NAMESPACE=test -Dspring.profiles.active=test"')]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("9200")]),s._v(":9200 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\nruoyi-auth:3.2.0\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 服务网关")]),s._v("\ndocker run "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--name ruoyi-gateway "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-e "),n("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("JAVA_PARAMS")]),n("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),n("span",{pre:!0,attrs:{class:"token string"}},[s._v('"-Dserver.port=8080 -Dfile.encoding=utf8 -DNACOS_DISCOVERY_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_SERVER_ADDR=172.18.80.214:8848 -DNACOS_CONFIG_NAMESPACE=test -Dspring.profiles.active=test"')]),s._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("8080")]),s._v(":8080 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\nruoyi-gateway:3.2.0\n\ndocker run --name ruoyi-ui "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),n("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v(":80 "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d ruoyi-ui:3.2.0\n")])]),s._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[s._v("1")]),n("br"),n("span",{staticClass:"line-number"},[s._v("2")]),n("br"),n("span",{staticClass:"line-number"},[s._v("3")]),n("br"),n("span",{staticClass:"line-number"},[s._v("4")]),n("br"),n("span",{staticClass:"line-number"},[s._v("5")]),n("br"),n("span",{staticClass:"line-number"},[s._v("6")]),n("br"),n("span",{staticClass:"line-number"},[s._v("7")]),n("br"),n("span",{staticClass:"line-number"},[s._v("8")]),n("br"),n("span",{staticClass:"line-number"},[s._v("9")]),n("br"),n("span",{staticClass:"line-number"},[s._v("10")]),n("br"),n("span",{staticClass:"line-number"},[s._v("11")]),n("br"),n("span",{staticClass:"line-number"},[s._v("12")]),n("br"),n("span",{staticClass:"line-number"},[s._v("13")]),n("br"),n("span",{staticClass:"line-number"},[s._v("14")]),n("br"),n("span",{staticClass:"line-number"},[s._v("15")]),n("br"),n("span",{staticClass:"line-number"},[s._v("16")]),n("br"),n("span",{staticClass:"line-number"},[s._v("17")]),n("br"),n("span",{staticClass:"line-number"},[s._v("18")]),n("br"),n("span",{staticClass:"line-number"},[s._v("19")]),n("br"),n("span",{staticClass:"line-number"},[s._v("20")]),n("br"),n("span",{staticClass:"line-number"},[s._v("21")]),n("br"),n("span",{staticClass:"line-number"},[s._v("22")]),n("br"),n("span",{staticClass:"line-number"},[s._v("23")]),n("br"),n("span",{staticClass:"line-number"},[s._v("24")]),n("br"),n("span",{staticClass:"line-number"},[s._v("25")]),n("br"),n("span",{staticClass:"line-number"},[s._v("26")]),n("br"),n("span",{staticClass:"line-number"},[s._v("27")]),n("br"),n("span",{staticClass:"line-number"},[s._v("28")]),n("br"),n("span",{staticClass:"line-number"},[s._v("29")]),n("br"),n("span",{staticClass:"line-number"},[s._v("30")]),n("br"),n("span",{staticClass:"line-number"},[s._v("31")]),n("br"),n("span",{staticClass:"line-number"},[s._v("32")]),n("br"),n("span",{staticClass:"line-number"},[s._v("33")]),n("br"),n("span",{staticClass:"line-number"},[s._v("34")]),n("br"),n("span",{staticClass:"line-number"},[s._v("35")]),n("br"),n("span",{staticClass:"line-number"},[s._v("36")]),n("br"),n("span",{staticClass:"line-number"},[s._v("37")]),n("br"),n("span",{staticClass:"line-number"},[s._v("38")]),n("br"),n("span",{staticClass:"line-number"},[s._v("39")]),n("br")])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/57.27dffdc1.js b/assets/js/57.27dffdc1.js new file mode 100644 index 00000000..5b2e3b5a --- /dev/null +++ b/assets/js/57.27dffdc1.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{691:function(s,e,a){"use strict";a.r(e);var t=a(7),n=Object(t.a)({},(function(){var s=this,e=s.$createElement,a=s._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("p",[s._v("拉取镜像")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("docker pull redis\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[s._v("运行redis-server容器")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("docker run --name redis-server "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--restart"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("always "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n--net "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("host")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-p "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v(":6379 "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-v /opt/redis/data:/data "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\n-d redis "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("\\")]),s._v("\nredis-server --appendonly "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("yes")]),s._v(" --save "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("60")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" --loglevel warning\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br")])]),a("p",[s._v("进入redis-cli客户端")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("docker "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exec")]),s._v(" -it 33bfe9767642 redis-cli\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("p",[a("a",{attrs:{href:"https://registry.hub.docker.com/_/redis",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://registry.hub.docker.com/_/redis"),a("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/60.609ccdac.js b/assets/js/60.609ccdac.js new file mode 100644 index 00000000..e3a8bc41 --- /dev/null +++ b/assets/js/60.609ccdac.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{701:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s.$createElement,t=s._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h2",{attrs:{id:"环境准备"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#环境准备"}},[s._v("#")]),s._v(" 环境准备")]),s._v(" "),t("h3",{attrs:{id:"jdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#jdk"}},[s._v("#")]),s._v(" JDK")]),s._v(" "),t("h4",{attrs:{id:"安装"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装"}},[s._v("#")]),s._v(" 安装")]),s._v(" "),t("p",[s._v("准备安装包:jdk-8u221-linux-x64.rpm")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看是否已经安装jdk")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -qa "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" jdk\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 卸载默认安装的jdk")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -e --nodeps jdk名称\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -e --nodeps java-1.7.0-openjdk-headless-1.7.0.261-2.6.22.2.el7_8.x86_64\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -e --nodeps copy-jdk-configs-3.3-10.el7_5.noarch\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -e --nodeps java-1.8.0-openjdk-headless-1.8.0.262.b10-1.el7.x86_64\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -e --nodeps java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -e --nodeps java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将安装包jdk-8u221-linux-x64.rpm上传至Linux")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -ivh jdk-8u221-linux-x64.rpm\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br")])]),t("h4",{attrs:{id:"配置"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置"}},[s._v("#")]),s._v(" 配置")]),s._v(" "),t("p",[s._v("配置环境变量")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("vi")]),s._v(" /etc/profile\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("添加以下内容")]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("JAVA_HOME=/usr/java/jdk1.8.0_221-amd64\nCLASSPATH=%JAVA_HOME%/lib:%JAVA_HOME%/jre/lib\nPATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin\nexport PATH CLASSPATH JAVA_HOME\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("使环境变量生效")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("source")]),s._v(" /etc/profile\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("查看jdk版本")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("java -version\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("h3",{attrs:{id:"tomcat"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tomcat"}},[s._v("#")]),s._v(" Tomcat")]),s._v(" "),t("h4",{attrs:{id:"安装-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-2"}},[s._v("#")]),s._v(" 安装")]),s._v(" "),t("p",[s._v("准备安装包:apache-tomcat-9.0.34.tar.gz")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解压")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -zxvf apache-tomcat-9.0.34.tar.gz\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("h4",{attrs:{id:"配置-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置-2"}},[s._v("#")]),s._v(" 配置")]),s._v(" "),t("div",{staticClass:"language-xml line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-xml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Server")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("port")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("8005"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("shutdown")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("SHUTDOWN"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Service")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("name")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("Catalina"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n \n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("\x3c!-- 修改默认端口号 --\x3e")]),s._v(" \n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Connector")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("port")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("8080"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("protocol")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("HTTP/1.1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("connectionTimeout")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("20000"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("redirectPort")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("8443"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("/>")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Connector")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("port")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("8009"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("protocol")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("AJP/1.3"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("redirectPort")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("8443"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("/>")])]),s._v("\n \n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Engine")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("name")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("Catalina"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("defaultHost")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("localhost"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Host")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("name")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("localhost"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("appBase")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("webapps"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("unpackWARs")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("true"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("autoDeploy")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("true"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n \n\t\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("\x3c!-- 配置虚拟目录 --\x3e")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("Context")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("path")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("/files"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("docBase")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("/opt/myweb/upload"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("reloadable")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("true"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("debug")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("0"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("crossContext")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("true"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("/>")])]),s._v("\n \n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br")])]),t("p",[t("strong",[s._v("同一台机器部署多个Tomcat")])]),s._v(" "),t("p",[s._v("1、复制多个tomcat")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将 apache-tomcat-9.0.34 解压目录复制多份")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" -r apache-tomcat-9.0.34 目标位置/目标文件夹名\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" -r apache-tomcat-9.0.34 tomcat-8081\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" -r apache-tomcat-9.0.34 tomcat-8082\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v(".\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("p",[s._v("2、配置环境变量")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("vi")]),s._v(" /etc/profile\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("​ 添加以下内容")]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("# 第一个Tomcat,端口号:8081\nexport CATALINA_BASE_8081=/usr/local/tomcat/tomcat-8081\nexport CATALINA_HOME_8081=/usr/local/tomcat/tomcat-8081\nexport TOMCAT_HOME_8081=/usr/local/tomcat/tomcat-8081\n \n# 第二个Tomcat,端口号:8082\nexport CATALINA_BASE_8082=/usr/local/tomcat/tomcat-8082\nexport CATALINA_HOME_8082=/usr/local/tomcat/tomcat-8082\nexport TOMCAT_HOME_8082=/usr/local/tomcat/tomcat-8082\n\n# 第N个\n...\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br")])]),t("p",[s._v("​\t\t使环境变量生效")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("source")]),s._v(" /etc/profile\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("3、对每个tomcat都"),t("strong",[s._v("修改")]),s._v("这"),t("strong",[s._v("三个文件bin/startup.sh、bin/shutdown.sh 、bin/catalina.sh")])]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("JAVA_HOME=/usr/java/jdk1.8.0_221-amd64\nCLASSPATH=%JAVA_HOME%/lib:%JAVA_HOME%/jre/lib\nPATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin\nexport PATH CLASSPATH JAVA_HOME\nexport CATALINA_BASE=$CATALINA_BASE_8081\t# 按需修改\nexport CATALINA_HOME=$CATALINA_HOME_8081\t# 按需修改\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("h4",{attrs:{id:"使用"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#使用"}},[s._v("#")]),s._v(" 使用")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" bin\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动")]),s._v("\n./startup.sh\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 关闭")]),s._v("\n./shutdown.sh\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" logs \n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看日志")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tail")]),s._v(" -f catalina.out\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br")])]),t("h3",{attrs:{id:"mysql"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#mysql"}},[s._v("#")]),s._v(" MySQL")]),s._v(" "),t("h4",{attrs:{id:"安装-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-3"}},[s._v("#")]),s._v(" 安装")]),s._v(" "),t("p",[s._v("准备安装包:mysql-8.0.20-1.el7.x86_64.rpm-bundle.tar")]),s._v(" "),t("p",[s._v("1、查看是否有mariadb,如果有则卸载自带的 mariadb")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看是否有mariadb")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -qa "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" mariadb\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 卸载默认的mariadb")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("p",[s._v("2、解压")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将文件解压到指定目录")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -xvf mysql-8.0.20-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("3、安装 common、libs、client、server")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /opt/mysql\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -ivh mysql-community-common-8.0.20-1.el7.x86_64.rpm --nodeps --force\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -ivh mysql-community-libs-8.0.20-1.el7.x86_64.rpm --nodeps --force\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -ivh mysql-community-client-8.0.20-1.el7.x86_64.rpm --nodeps --force\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -ivh mysql-community-server-8.0.20-1.el7.x86_64.rpm --nodeps --force\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("p",[s._v("4、初始化MySQL")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("mysqld --initialize\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解决:mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory")]),s._v("\nyum "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y libaio\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("p",[s._v("5、授权防火墙")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" mysql:mysql /var/lib/mysql -R"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nsystemctl start mysqld.service"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\nsystemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" mysqld"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("6、查看数据库的初始化密码")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" /var/log/mysqld.log "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" password\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("7、登录MySQL")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("mysql -u root -p\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("8、修改初始化密码")]),s._v(" "),t("div",{staticClass:"language-mysql line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("9、开启远程访问")]),s._v(" "),t("div",{staticClass:"language-mysql line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("create user 'root'@'%' identified with mysql_native_password by 'root';\ngrant all privileges on *.* to 'root'@'%' with grant option;\nflush privileges;\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("10、MySQL 安装默认使用美国的时区,北京时间比美国晚 8 小时")]),s._v(" "),t("div",{staticClass:"language-mysql line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("set global time_zone='+8:00';\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("11、开放3306端口")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("firewall-cmd --zone"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("public --add-port"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("3306")]),s._v("/tcp --permanent\nsystemctl restart firewalld.service\nfirewall-cmd --reload\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("12、重新登录MySQL")]),s._v(" "),t("h3",{attrs:{id:"redis"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#redis"}},[s._v("#")]),s._v(" Redis")]),s._v(" "),t("h4",{attrs:{id:"安装-4"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-4"}},[s._v("#")]),s._v(" 安装")]),s._v(" "),t("p",[s._v("准备安装包:redis-6.0.9.tar.gz")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解压文件")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -z或--gzip或--ungzip 通过gzip指令处理备份文件。")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -x或--extract或--get 从备份文件中还原文件。")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -v或--verbose 显示指令执行过程。")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -f<备份文件>或--file=<备份文件> 指定备份文件。")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -zxvf redis-6.0.9.tar.gz -C /opt/redis\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 进入Redis解压目录")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" redis-6.0.9\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 编译")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解决:“cc:命令未找到” 报错。yum方式安装需要能上网")]),s._v("\nyum -y "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" gcc\nyum -y "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" gcc-c++\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解决:jemalloc/jemalloc.h:没有那个文件或目录” ")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("MALLOC")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("libc\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解决:‘struct redisServer’没有名为‘maxmemory’的成员")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 在阿里云,centos-release-scl 可能安装不成功,解决方法见后")]),s._v("\nyum "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" centos-release-scl -y\nyum "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" devtoolset-9-gcc\nscl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" devtoolset-9 "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("bash")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看安装位置")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("whereis")]),s._v(" redis-cli\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("whereis")]),s._v(" redis-server\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br")])]),t("p",[t("strong",[s._v("在阿里云上,运行 yum install centos-release-scl,出现 No package centos-release-scl available.解决:")])]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -ivh https://cbs.centos.org/kojifiles/packages/centos-release-scl-rh/2/3.el7.centos/noarch/centos-release-scl-rh-2-3.el7.centos.noarch.rpm\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -ivh https://cbs.centos.org/kojifiles/packages/centos-release-scl/2/3.el7.centos/noarch/centos-release-scl-2-3.el7.centos.noarch.rpm\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("h4",{attrs:{id:"配置-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置-3"}},[s._v("#")]),s._v(" 配置")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" redis.conf /opt/redis/redis.conf\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" /opt/redis\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("vi")]),s._v(" redis.conf\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("以守护进程方式启动Redis")]),s._v(" "),t("div",{staticClass:"language-conf line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("# By default Redis does not run as a daemon. Use 'yes' if you need it.\n# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.\ndaemonize yes\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("h4",{attrs:{id:"使用-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#使用-2"}},[s._v("#")]),s._v(" 使用")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 指定配置文件启动Redis服务器")]),s._v("\n/usr/local/bin/redis-server /opt/redis/redis.conf\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 进入Redis客户端")]),s._v("\n/usr/local/bin/redis-cli -p "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("6379")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 退出Redis客户端")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("127.0")]),s._v(".0.1:637"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("9")]),s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("shutdown")]),s._v("\nnot connected"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exit")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br")])]),t("div",{staticClass:"language-Redis line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("keys *\n\nset key value\nget key\ndel key\n\n# 查看 key 还有多少秒过期,-1表示永不过期\nttl key\n\n# 清空当前库\nflushdb\n\n# 清空所有库\nflushall\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br")])]),t("h3",{attrs:{id:"nginx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#nginx"}},[s._v("#")]),s._v(" Nginx")]),s._v(" "),t("h4",{attrs:{id:"安装-5"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装-5"}},[s._v("#")]),s._v(" 安装")]),s._v(" "),t("p",[s._v("准备安装包:")]),s._v(" "),t("p",[s._v("pcre-8.37.tar.gz")]),s._v(" "),t("p",[s._v("nginx-1.12.2.tar.gz")]),s._v(" "),t("p",[s._v("1、安装pcre")]),s._v(" "),t("p",[s._v("PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。")]),s._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/LiuYanYGZ/p/5903954.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("PCRE的安装及使用"),t("OutboundLink")],1)]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -xvf pcre-8.37.tar.gz -C /opt/pcre\n./configure\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v("\npcre-config --version\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("p",[s._v("2、安装 openssl 、zlib 、 gcc 依赖")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("yum -y "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" zlib zlib-devel gcc-c++ libtool openssl openssl-devel\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("3、安装Nginx")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -xvf nginx-1.12.2.tar.gz -C /opt/nginx\n./configure\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解决:cc1: all warnings being treated as errors")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" objs\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" Makefile\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将 CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 的 -Werror -g 去掉,保存退出,重新编译")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装路径")]),s._v("\n/usr/local/nginx\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br")])]),t("h4",{attrs:{id:"配置-4"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#配置-4"}},[s._v("#")]),s._v(" 配置")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("vi")]),s._v(" /usr/local/nginx/conf/nginx.conf\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("div",{staticClass:"language-conf line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("server {\n listen 80;\n server_name 192.168.66.131;\n\n\t\t# 反向代理,防止java代码获取的是127.0.0.1\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Host $http_host;\n proxy_set_header X-NginX-Proxy true;\n \n # 解决:中文乱码\n\t\tcharset utf-8;\n\n\t\t# 反向代理-文件系统\n location ~ /files/ {\n proxy_pass http://127.0.0.1:8081;\n }\n\n\t\t# 反向代理-HRAPI\n location ~ /hrapi/ {\n proxy_pass http://127.0.0.1:8082;\n }\n\n\t\t# 反向代理-UUAP\n location ~ /uuap/ {\n proxy_pass http://127.0.0.1:8083;\n }\n\n\t\t# 动静分离-UUAP(需要验证)\n # location ~ /uuap/*.*\\.(css|js|gif|jpg|png)$ {\n # root /opt/myweb/uuap/static;\n # }\n # 动静分离-UUAP(需要验证)\n location ~ /uuap/*.*\\.(css|js|gif|jpg|png)$ {\n root html/uuap/static;\n }\n\n\t\t# 静态资源\n location / {\n \t# 自己的静态网站直接放在 /usr/local/nginx/html 目录下,访问时通过目录名访问\n root html;\n index index.html index.htm;\n }\n}\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br"),t("span",{staticClass:"line-number"},[s._v("41")]),t("br"),t("span",{staticClass:"line-number"},[s._v("42")]),t("br"),t("span",{staticClass:"line-number"},[s._v("43")]),t("br"),t("span",{staticClass:"line-number"},[s._v("44")]),t("br")])]),t("h4",{attrs:{id:"使用-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#使用-3"}},[s._v("#")]),s._v(" 使用")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动")]),s._v("\n./nginx\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 停止")]),s._v("\n./nginx -s stop\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 修改配置后重加载")]),s._v("\n./nginx -s reload\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br")])]),t("p",[s._v("如果出现403错误,vi nginx.conf,将user nobody 改为 root")]),s._v(" "),t("h2",{attrs:{id:"应用部署"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#应用部署"}},[s._v("#")]),s._v(" 应用部署")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# jar启动SpringBoot应用,后台运行,并制定日志输出位置")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("nohup")]),s._v(" java -jar uuap.jar --spring.profiles.active"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("uat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),s._v(" uuap.txt "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("nohup")]),s._v(" java -jar hr-api.jar --spring.profiles.active"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("uat "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">>")]),s._v(" hr-api.txt "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查找应用进程")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ps")]),s._v(" -ef"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" uuap\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 杀死应用进程")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("kill")]),s._v(" -9 "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("19144")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br")])]),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/maiaimei/p/14219265.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("idea下springboot打jar、war包及部署外部tomcat"),t("OutboundLink")],1)]),s._v(" "),t("h2",{attrs:{id:"参考资料"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#参考资料"}},[s._v("#")]),s._v(" 参考资料")]),s._v(" "),t("p",[t("a",{attrs:{href:"https://www.bilibili.com/video/BV1XA41147vi",target:"_blank",rel:"noopener noreferrer"}},[s._v("【2020版】2小时上手Linux环境搭建,部署Java应用"),t("OutboundLink")],1)]),s._v(" "),t("p",[t("a",{attrs:{href:"https://www.bilibili.com/video/BV1zJ411w7SV",target:"_blank",rel:"noopener noreferrer"}},[s._v("尚硅谷Nginx教程(nginx快速上手)"),t("OutboundLink")],1)])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/62.472bb012.js b/assets/js/62.472bb012.js new file mode 100644 index 00000000..f55847e0 --- /dev/null +++ b/assets/js/62.472bb012.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{702:function(t,s,a){"use strict";a.r(s);var n=a(7),r=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"安装"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#安装"}},[t._v("#")]),t._v(" 安装")]),t._v(" "),a("p",[t._v("在 "),a("a",{attrs:{href:"https://maven.apache.org/download.cgi",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://maven.apache.org/download.cgi"),a("OutboundLink")],1),t._v(" 下载压缩包,解压即可。")]),t._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" -xzf apache-maven-3.8.4-bin.tar.gz\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("h2",{attrs:{id:"配置环境变量"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置环境变量"}},[t._v("#")]),t._v(" 配置环境变量")]),t._v(" "),a("p",[t._v("M2_HOME = Maven解压目录")]),t._v(" "),a("p",[t._v("Path 添加 %M2_HOME%\\bin")]),t._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" /etc/profile\n\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("M2_HOME")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/usr/local/apache-maven-3.8.4 \n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$JAVA_HOME")]),t._v("/bin:"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$JAVA_HOME")]),t._v("/jre/bin:"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$M2_HOME")]),t._v("/bin\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")]),t._v(" CLASSPATH JAVA_HOME M2_HOME\n\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("source")]),t._v(" /etc/profile\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br")])]),a("h2",{attrs:{id:"测试安装是否成功"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#测试安装是否成功"}},[t._v("#")]),t._v(" 测试安装是否成功")]),t._v(" "),a("p",[t._v("检测 Maven 是否安装配置成功,在 cmd 窗口输入:")]),t._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[t._v("mvn -v\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("h2",{attrs:{id:"conf-settings-xml"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#conf-settings-xml"}},[t._v("#")]),t._v(" conf/settings.xml")]),t._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("settings")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- 配置本地仓库 --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("localRepository")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("D:\\Maven\\repository"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- 配置镜像 --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- https://developer.aliyun.com/mvn/guide --\x3e")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mirrors")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mirror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("aliyun-central"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("aliyun-central"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("https://maven.aliyun.com/repository/central"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mirrorOf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("central"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mirror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("aliyun-public"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("aliyun-public"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("https://maven.aliyun.com/repository/public"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mirrorOf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("public"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mirror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("aliyun-google"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("aliyun-google"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("https://maven.aliyun.com/repository/google"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mirrorOf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("google"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mirror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("aliyun-spring"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("aliyun-spring"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("https://maven.aliyun.com/repository/spring"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mirrorOf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("spring"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mirror")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("aliyun-spring-plugin"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("name")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("aliyun-spring-plugin"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("url")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("https://maven.aliyun.com/repository/spring-plugin"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("mirrorOf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("spring-plugin"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("profiles")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- 修改Maven默认的JDK版本 --\x3e")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("profile")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("id")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("jdk-1.8"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("activation")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("jdk")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("1.8"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("activeByDefault")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("true"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("properties")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("maven.compiler.source")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("1.8"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("maven.compiler.target")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("1.8"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("maven.compiler.compilerVersion")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("1.8"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br"),a("span",{staticClass:"line-number"},[t._v("14")]),a("br"),a("span",{staticClass:"line-number"},[t._v("15")]),a("br"),a("span",{staticClass:"line-number"},[t._v("16")]),a("br"),a("span",{staticClass:"line-number"},[t._v("17")]),a("br"),a("span",{staticClass:"line-number"},[t._v("18")]),a("br"),a("span",{staticClass:"line-number"},[t._v("19")]),a("br"),a("span",{staticClass:"line-number"},[t._v("20")]),a("br"),a("span",{staticClass:"line-number"},[t._v("21")]),a("br"),a("span",{staticClass:"line-number"},[t._v("22")]),a("br"),a("span",{staticClass:"line-number"},[t._v("23")]),a("br"),a("span",{staticClass:"line-number"},[t._v("24")]),a("br"),a("span",{staticClass:"line-number"},[t._v("25")]),a("br"),a("span",{staticClass:"line-number"},[t._v("26")]),a("br"),a("span",{staticClass:"line-number"},[t._v("27")]),a("br"),a("span",{staticClass:"line-number"},[t._v("28")]),a("br"),a("span",{staticClass:"line-number"},[t._v("29")]),a("br"),a("span",{staticClass:"line-number"},[t._v("30")]),a("br"),a("span",{staticClass:"line-number"},[t._v("31")]),a("br"),a("span",{staticClass:"line-number"},[t._v("32")]),a("br"),a("span",{staticClass:"line-number"},[t._v("33")]),a("br"),a("span",{staticClass:"line-number"},[t._v("34")]),a("br"),a("span",{staticClass:"line-number"},[t._v("35")]),a("br"),a("span",{staticClass:"line-number"},[t._v("36")]),a("br"),a("span",{staticClass:"line-number"},[t._v("37")]),a("br"),a("span",{staticClass:"line-number"},[t._v("38")]),a("br"),a("span",{staticClass:"line-number"},[t._v("39")]),a("br"),a("span",{staticClass:"line-number"},[t._v("40")]),a("br"),a("span",{staticClass:"line-number"},[t._v("41")]),a("br"),a("span",{staticClass:"line-number"},[t._v("42")]),a("br"),a("span",{staticClass:"line-number"},[t._v("43")]),a("br"),a("span",{staticClass:"line-number"},[t._v("44")]),a("br"),a("span",{staticClass:"line-number"},[t._v("45")]),a("br"),a("span",{staticClass:"line-number"},[t._v("46")]),a("br"),a("span",{staticClass:"line-number"},[t._v("47")]),a("br"),a("span",{staticClass:"line-number"},[t._v("48")]),a("br"),a("span",{staticClass:"line-number"},[t._v("49")]),a("br"),a("span",{staticClass:"line-number"},[t._v("50")]),a("br"),a("span",{staticClass:"line-number"},[t._v("51")]),a("br"),a("span",{staticClass:"line-number"},[t._v("52")]),a("br"),a("span",{staticClass:"line-number"},[t._v("53")]),a("br")])]),a("h2",{attrs:{id:"pom"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#pom"}},[t._v("#")]),t._v(" pom")]),t._v(" "),a("p",[a("strong",[t._v("optional")]),t._v(" 是 maven 依赖 jar 时的一个选项,表示该依赖是可选的,项目之间依赖不传递。可以理解为此功能/此依赖可选,如果不需要某项功能,可以不引用这个包。不设置optional或者optional设置为false,表示依赖传递。")]),t._v(" "),a("p",[a("strong",[t._v("scope")]),t._v(" 是 maven 依赖 jar 时的一个选项,用于指定该依赖的作用范围和依赖传递。")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("可选值")]),t._v(" "),a("th",[t._v("作用范围")]),t._v(" "),a("th",[t._v("依赖传递")]),t._v(" "),a("th",[t._v("例子")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("compile")]),t._v(" "),a("td",[t._v("在编译、测试、运行时均有效,不指定 scope 时默认为 compile")]),t._v(" "),a("td",[t._v("是")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("provided")]),t._v(" "),a("td",[t._v("在编译、测试时有效,但是在运行时无效。"),a("br"),t._v("相当于compile,但是在打包阶段做了exclude的动作。"),a("br"),t._v("理论上可以参与编译、测试、运行等周期。"),a("br"),t._v("可以理解为此包不由我直接提供,需要调用者/容器提供。")]),t._v(" "),a("td",[t._v("否")]),t._v(" "),a("td",[t._v("lombok")])]),t._v(" "),a("tr",[a("td",[t._v("runtime")]),t._v(" "),a("td",[t._v("在运行、测试时有效,但是在编译时无效")]),t._v(" "),a("td",[t._v("是")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("test")]),t._v(" "),a("td",[t._v("只在测试时有效")]),t._v(" "),a("td",[t._v("否")]),t._v(" "),a("td",[t._v("junit")])])])]),t._v(" "),a("h2",{attrs:{id:"mvn"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mvn"}},[t._v("#")]),t._v(" mvn")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[t._v("参数")]),t._v(" "),a("th",[t._v("说明")]),t._v(" "),a("th",[t._v("例子")])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("-Pxxx")]),t._v(" "),a("td",[t._v("激活 id 为 xxx 的 profile (如有多个,用逗号隔开)")]),t._v(" "),a("td")]),t._v(" "),a("tr",[a("td",[t._v("-Dxxx=yyy")]),t._v(" "),a("td",[t._v("指定系统属性")]),t._v(" "),a("td",[t._v("mvn package -Dmaven.test.skip=true"),a("br"),t._v("mvn spring-boot:run -Dspring-boot.run.profiles=dev,local")])]),t._v(" "),a("tr",[a("td",[t._v("-U")]),t._v(" "),a("td",[t._v("强制更新 snapshot 类型的插件或依赖库 "),a("br"),t._v("否则 maven 一天只会更新一次 snapshot 依赖")]),t._v(" "),a("td")])])]),t._v(" "),a("p",[t._v("综合示例:")]),t._v(" "),a("div",{staticClass:"language-bash line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("mvn -Prelease-nacos -Dmaven.test.skip"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true clean "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" -U\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/65.44c60d43.js b/assets/js/65.44c60d43.js new file mode 100644 index 00000000..c8781680 --- /dev/null +++ b/assets/js/65.44c60d43.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{709:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s.$createElement,t=s._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("p",[t("a",{attrs:{href:"https://www.sonarqube.org/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://www.sonarqube.org/"),t("OutboundLink")],1)]),s._v(" "),t("h2",{attrs:{id:"环境准备"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#环境准备"}},[s._v("#")]),s._v(" 环境准备")]),s._v(" "),t("p",[s._v("First, check the "),t("a",{attrs:{href:"https://docs.sonarqube.org/latest/requirements/requirements/",target:"_blank",rel:"noopener noreferrer"}},[s._v("requirements"),t("OutboundLink")],1),s._v(". Then download and unzip the "),t("a",{attrs:{href:"https://www.sonarqube.org/downloads/",target:"_blank",rel:"noopener noreferrer"}},[s._v("distribution"),t("OutboundLink")],1),s._v(" (do not unzip into a directory starting with a digit).")]),s._v(" "),t("p",[s._v("SonarQube cannot be run as "),t("code",[s._v("root")]),s._v(" on Unix-based systems, so create a dedicated user account for SonarQube if necessary.")]),s._v(" "),t("h3",{attrs:{id:"安装sonarqube"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装sonarqube"}},[s._v("#")]),s._v(" 安装SonarQube")]),s._v(" "),t("p",[s._v("0、安装JDK11")]),s._v(" "),t("p",[s._v("1、创建目录 "),t("code",[s._v("/usr/local/sonar")]),s._v(" ,上传文件 sonarqube-9.6.1.59531.zip 到"),t("code",[s._v("/usr/local/sonar")])]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("unzip")]),s._v(" sonarqube-9.6.1.59531.zip\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("mv")]),s._v(" sonarqube-9.6.1.59531 sonarqube\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("2、授权")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 创建用户组")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupadd")]),s._v(" sonar\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 创建用户sonar,并将用户sonar加入用户组sonar")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("useradd")]),s._v(" sonar -g sonar\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 授权")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" -R sonar:sonar sonarqube\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[s._v("3、启动SonarQube")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("su")]),s._v(" - sonar\n/usr/local/sonar/sonarqube/bin/linux-x86-64/sonar.sh start\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tail")]),s._v(" -f /usr/local/sonar/sonarqube/logs/sonar.log\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("4、浏览器访问")]),s._v(" "),t("p",[s._v("http://192.168.1.24:9000/")]),s._v(" "),t("p",[s._v("账号:admin")]),s._v(" "),t("p",[s._v("密码:admin")]),s._v(" "),t("p",[s._v("首次登录需要修改密码,新密码为:123456")]),s._v(" "),t("p",[s._v("5、停止SonarQube")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("/usr/local/sonar/sonarqube/bin/linux-x86-64/sonar.sh stop\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("6、创建在PostgreSQL中创建sonar用户,创建sonarqube数据库")]),s._v(" "),t("p",[s._v("7、修改数据库连接")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /usr/local/sonar/sonarqube/conf/sonar.properties\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("div",{staticClass:"language-properties line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-properties"}},[t("code",[t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("sonar.jdbc.username")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("sonar")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("sonar.jdbc.password")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("sonar")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("sonar.jdbc.url")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("jdbc:postgresql://192.168.1.25/sonarqube?currentSchema=public")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("8、启动SonarQube")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("su")]),s._v(" - sonar\n/usr/local/sonar/sonarqube/bin/linux-x86-64/sonar.sh start\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tail")]),s._v(" -f /usr/local/sonar/sonarqube/logs/sonar.log\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[t("strong",[s._v("Q & A")])]),s._v(" "),t("p",[s._v("1、无法启动SonarQube,ES启动失败,报错如下:")]),s._v(" "),t("div",{staticClass:"language- line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[s._v("[sonar@sonarqube ~]$ tail -f /usr/local/sonar/sonarqube/logs/sonar.log\n2022.09.17 15:14:57 INFO app[][o.s.a.SchedulerImpl] Waiting for Elasticsearch to be up and running\n2022.09.17 15:15:02 WARN app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [ElasticSearch]: 78\n2022.09.17 15:15:02 INFO app[][o.s.a.SchedulerImpl] Process[ElasticSearch] is stopped\n2022.09.17 15:15:02 INFO app[][o.s.a.SchedulerImpl] SonarQube is stopped\n\n[sonar@sonarqube ~]$ cat /usr/local/sonar/sonarqube/logs/es.log\nbootstrap check failure [1] of [2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]\nbootstrap check failure [2] of [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br")])]),t("p",[s._v("解决方案:")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 切换用户")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("su")]),s._v(" - root\n\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@sonarqube ~"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# vim /etc/security/limits.conf")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 追加以下内容")]),s._v("\n* soft nofile "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("65536")]),s._v("\n* hard nofile "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("65536")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@sonarqube ~"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# vim /etc/sysctl.conf")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 添加以下内容")]),s._v("\nvm.max_map_count"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("262144")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@sonarqube ~"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# reboot")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@sonarqube ~"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ulimit -S -n")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("65536")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@sonarqube ~"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ulimit -H -n")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("65536")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@sonarqube ~"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# sysctl -p")]),s._v("\nvm.max_map_count "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("262144")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br")])]),t("h3",{attrs:{id:"安装postgresql"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装postgresql"}},[s._v("#")]),s._v(" 安装PostgreSQL")]),s._v(" "),t("p",[t("RouterLink",{attrs:{to:"/article/database/postgresql.html"}},[s._v("PostgreSQL学习笔记 | 初冬十月の笔记")])],1),s._v(" "),t("h2",{attrs:{id:"sonarscanner-for-maven"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sonarscanner-for-maven"}},[s._v("#")]),s._v(" SonarScanner for Maven")]),s._v(" "),t("p",[t("a",{attrs:{href:"https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-maven/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-maven/"),t("OutboundLink")],1)]),s._v(" "),t("p",[t("a",{attrs:{href:"https://docs.sonarqube.org/latest/analysis/analysis-parameters/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.sonarqube.org/latest/analysis/analysis-parameters/"),t("OutboundLink")],1)]),s._v(" "),t("p",[t("a",{attrs:{href:"https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/"),t("OutboundLink")],1)]),s._v(" "),t("p",[t("a",{attrs:{href:"https://docs.sonarqube.org/latest/analysis/languages/java/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.sonarqube.org/latest/analysis/languages/java/"),t("OutboundLink")],1)]),s._v(" "),t("p",[t("a",{attrs:{href:"https://docs.sonarqube.org/latest/branches/overview/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.sonarqube.org/latest/branches/overview/"),t("OutboundLink")],1)]),s._v(" "),t("p",[s._v("Maven的setting.xml")]),s._v(" "),t("div",{staticClass:"language-xml line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-xml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("settings")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("pluginGroups")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("pluginGroup")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.sonarsource.scanner.maven"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("profiles")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("profile")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("id")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("sonar"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("activation")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("activeByDefault")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("true"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("properties")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("\x3c!-- Optional URL to server. Default value is http://localhost:9000 --\x3e")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("sonar.host.url")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n http://myserver:9000\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br")])]),t("p",[s._v("项目的pom.xml")]),s._v(" "),t("div",{staticClass:"language-xml line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-xml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token prolog"}},[s._v('')]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("project")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("xmlns")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("http://maven.apache.org/POM/4.0.0"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("xmlns:")]),s._v("xsi")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("http://www.w3.org/2001/XMLSchema-instance"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token attr-name"}},[t("span",{pre:!0,attrs:{class:"token namespace"}},[s._v("xsi:")]),s._v("schemaLocation")]),t("span",{pre:!0,attrs:{class:"token attr-value"}},[t("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')]),s._v("http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v('"')])]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("modelVersion")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("4.0.0"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.example"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("sonar-test"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("1.0-SNAPSHOT"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("properties")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("\x3c!-- https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/ --\x3e")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("sonar.language")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("java"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("sonar.sources")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("src/main/java"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("sonar.tests")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("src/test/java"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("sonar.exclusions")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n **/util/*.java\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("sonar.coverage.exclusions")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n **/util/*.java\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("sonar.test.exclusions")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n **/*Test.java\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("build")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("pluginManagement")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("plugins")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("plugin")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.maven.plugins"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("maven-surefire-plugin"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("2.22.2"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("configuration")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("reuseForks")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("false"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("forkCount")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("1"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("plugin")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.sonarsource.scanner.maven"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("sonar-maven-plugin"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("3.7.0.1746"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("profiles")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("profile")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("id")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("coverage"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("build")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("plugins")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("plugin")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.jacoco"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("jacoco-maven-plugin"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("0.8.7"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("executions")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("execution")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("id")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("prepare-agent"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("goals")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("goal")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("prepare-agent"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("execution")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("id")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("report"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("goals")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("goal")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("report"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("configuration")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("formats")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("format")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("XML"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br"),t("span",{staticClass:"line-number"},[s._v("41")]),t("br"),t("span",{staticClass:"line-number"},[s._v("42")]),t("br"),t("span",{staticClass:"line-number"},[s._v("43")]),t("br"),t("span",{staticClass:"line-number"},[s._v("44")]),t("br"),t("span",{staticClass:"line-number"},[s._v("45")]),t("br"),t("span",{staticClass:"line-number"},[s._v("46")]),t("br"),t("span",{staticClass:"line-number"},[s._v("47")]),t("br"),t("span",{staticClass:"line-number"},[s._v("48")]),t("br"),t("span",{staticClass:"line-number"},[s._v("49")]),t("br"),t("span",{staticClass:"line-number"},[s._v("50")]),t("br"),t("span",{staticClass:"line-number"},[s._v("51")]),t("br"),t("span",{staticClass:"line-number"},[s._v("52")]),t("br"),t("span",{staticClass:"line-number"},[s._v("53")]),t("br"),t("span",{staticClass:"line-number"},[s._v("54")]),t("br"),t("span",{staticClass:"line-number"},[s._v("55")]),t("br"),t("span",{staticClass:"line-number"},[s._v("56")]),t("br"),t("span",{staticClass:"line-number"},[s._v("57")]),t("br"),t("span",{staticClass:"line-number"},[s._v("58")]),t("br"),t("span",{staticClass:"line-number"},[s._v("59")]),t("br"),t("span",{staticClass:"line-number"},[s._v("60")]),t("br"),t("span",{staticClass:"line-number"},[s._v("61")]),t("br"),t("span",{staticClass:"line-number"},[s._v("62")]),t("br"),t("span",{staticClass:"line-number"},[s._v("63")]),t("br"),t("span",{staticClass:"line-number"},[s._v("64")]),t("br"),t("span",{staticClass:"line-number"},[s._v("65")]),t("br"),t("span",{staticClass:"line-number"},[s._v("66")]),t("br"),t("span",{staticClass:"line-number"},[s._v("67")]),t("br"),t("span",{staticClass:"line-number"},[s._v("68")]),t("br"),t("span",{staticClass:"line-number"},[s._v("69")]),t("br"),t("span",{staticClass:"line-number"},[s._v("70")]),t("br"),t("span",{staticClass:"line-number"},[s._v("71")]),t("br"),t("span",{staticClass:"line-number"},[s._v("72")]),t("br"),t("span",{staticClass:"line-number"},[s._v("73")]),t("br"),t("span",{staticClass:"line-number"},[s._v("74")]),t("br"),t("span",{staticClass:"line-number"},[s._v("75")]),t("br"),t("span",{staticClass:"line-number"},[s._v("76")]),t("br"),t("span",{staticClass:"line-number"},[s._v("77")]),t("br"),t("span",{staticClass:"line-number"},[s._v("78")]),t("br"),t("span",{staticClass:"line-number"},[s._v("79")]),t("br"),t("span",{staticClass:"line-number"},[s._v("80")]),t("br"),t("span",{staticClass:"line-number"},[s._v("81")]),t("br"),t("span",{staticClass:"line-number"},[s._v("82")]),t("br")])]),t("p",[s._v("在IDEA终端(这里终端用的是D:\\Git\\bin\\bash.exe)执行:")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看mvn的jdk版本")]),s._v("\nmvn -v\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 切换jdk版本,mvn sonar:sonar需要jdk11")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("export")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("JAVA_HOME")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("D:/Java/jdk-11.0.13\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看mvn的jdk版本")]),s._v("\nmvn -v\n\n\nmvn clean verify sonar:sonar -Dsonar.login"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("squ_3a4736f2ccfffd3015089651f356e6880c0f312c\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 覆盖率")]),s._v("\nmvn clean verify sonar:sonar -Dsonar.login"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("squ_3a4736f2ccfffd3015089651f356e6880c0f312c -Pcoverage\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 分支+覆盖率")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# Validation of project failed: To use the property "sonar.branch.name" and analyze branches, Developer Edition or above is required. See https://redirect.sonarsource.com/doc/branches.html for more information.')]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# https://github.com/mc1arke/sonarqube-community-branch-plugin")]),s._v("\nmvn clean verify sonar:sonar -Dsonar.login"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("squ_3a4736f2ccfffd3015089651f356e6880c0f312c -Pcoverage -Dsonar.branch.name"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("release-091701\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br")])]),t("h2",{attrs:{id:"q-a"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#q-a"}},[s._v("#")]),s._v(" Q & A")]),s._v(" "),t("p",[s._v("1、Junit执行单元测试用例成功,mvn test却失败的问题和解决方法。")]),s._v(" "),t("p",[s._v("Run Unit Test和Maven test的区别")]),s._v(" "),t("p",[s._v("差异1:在IDE中通过选中单元测试路径,点击右键选择run test和点击maven中的test是有区别的。在Maven执行测试的过程中,是不允许测试cases访问其他项目的测试类和其他项目的resources下文件的。也就是说,在a/src/test/java下的测试用例,是不能引用b/src/test/java中的类的,同时也不允许访问b/src/test/resources下的资源的。但是在IDE中的Run Unit Test几乎是没有这样的限制的。")]),s._v(" "),t("p",[s._v("差异2:Maven强制要求src/test/java下不能存在resource的文件,必须放到src/test/reources文件夹下,但是IDE却很少有对应的约束。")]),s._v(" "),t("p",[s._v("这些约束就是导致IDE下Run Unit Test是成功的,但是在Maven中失败的原因。")]),s._v(" "),t("p",[s._v("解决的办法\n在maven插件配置:(surefire2.14以下版本)")]),s._v(" "),t("div",{staticClass:"language-xml line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-xml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("plugin")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.maven.plugins"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("maven-surefire-plugin"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("2.12"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("configuration")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("forkMode")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("always"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br")])]),t("p",[s._v("在maven插件配置:(surefire2.14及其以上版本)")]),s._v(" "),t("div",{staticClass:"language-xml line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-xml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("plugin")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("groupId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("org.apache.maven.plugins"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("artifactId")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("maven-surefire-plugin"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("version")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("2.19.1"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("configuration")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("reuseForks")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("false"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("<")]),s._v("forkCount")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(">")])]),s._v("1"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token tag"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("")])]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br")])]),t("p",[s._v("链接:https://www.jianshu.com/p/db100584a9a7")]),s._v(" "),t("p",[s._v("2、SonarQube显示不同分支的扫描结果")]),s._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/mc1arke/sonarqube-community-branch-plugin/releases",target:"_blank",rel:"noopener noreferrer"}},[s._v("Download a compatible release version of the sonarqube-community-branch-plugin JAR"),t("OutboundLink")],1),s._v(" .")]),s._v(" "),t("ol",[t("li",[s._v("Copy the plugin JAR file to the "),t("code",[s._v("extensions/plugins/")]),s._v(" directory of your SonarQube instance")]),s._v(" "),t("li",[s._v("Add "),t("code",[s._v("-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-${version}.jar=web")]),s._v(" to the "),t("code",[s._v("sonar.web.javaAdditionalOpts")]),s._v(" property in your Sonarqube installation's "),t("code",[s._v("conf/sonar.properties")]),s._v(" file, e.g. "),t("code",[s._v("sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.0.jar=web")])]),s._v(" "),t("li",[s._v("Add "),t("code",[s._v("-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-${version}.jar=ce")]),s._v(" to the "),t("code",[s._v("sonar.ce.javaAdditionalOpts")]),s._v(" property in your Sonarqube installation's "),t("code",[s._v("conf/sonar.properties")]),s._v(" file, e.g. "),t("code",[s._v("sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.0.jar=ce")])]),s._v(" "),t("li",[s._v("Start Sonarqube, and accept the warning about using third-party plugins")])]),s._v(" "),t("p",[s._v("链接:")]),s._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/mc1arke/sonarqube-community-branch-plugin",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://github.com/mc1arke/sonarqube-community-branch-plugin"),t("OutboundLink")],1)]),s._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/CN_TangZheng/article/details/112990592",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://blog.csdn.net/CN_TangZheng/article/details/112990592"),t("OutboundLink")],1)])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/66.279e49a6.js b/assets/js/66.279e49a6.js new file mode 100644 index 00000000..4681ca06 --- /dev/null +++ b/assets/js/66.279e49a6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{706:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"配置404页面"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#配置404页面"}},[t._v("#")]),t._v(" 配置404页面")]),t._v(" "),a("p",[t._v("修改 conf/web.xml")]),t._v(" "),a("div",{staticClass:"language-xml line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-xml"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("web-app")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- 欢迎页 --\x3e")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("welcome-file-list")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("welcome-file")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("index.html"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("welcome-file")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("index.htm"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("welcome-file")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("index.jsp"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v(" \n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("error-page")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("error-code")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("404"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("\x3c!-- 定义的页面,必须以“/”开头,放在项目根路径下 --\x3e")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("location")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("/404.html"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br"),a("span",{staticClass:"line-number"},[t._v("5")]),a("br"),a("span",{staticClass:"line-number"},[t._v("6")]),a("br"),a("span",{staticClass:"line-number"},[t._v("7")]),a("br"),a("span",{staticClass:"line-number"},[t._v("8")]),a("br"),a("span",{staticClass:"line-number"},[t._v("9")]),a("br"),a("span",{staticClass:"line-number"},[t._v("10")]),a("br"),a("span",{staticClass:"line-number"},[t._v("11")]),a("br"),a("span",{staticClass:"line-number"},[t._v("12")]),a("br"),a("span",{staticClass:"line-number"},[t._v("13")]),a("br")])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/67.7e10af4c.js b/assets/js/67.7e10af4c.js new file mode 100644 index 00000000..d77f4ab2 --- /dev/null +++ b/assets/js/67.7e10af4c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{707:function(t,e,n){"use strict";n.r(e);var s=n(7),i=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("格式化代码:Shift + Tab")])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/69.f8ef2c05.js b/assets/js/69.f8ef2c05.js new file mode 100644 index 00000000..f6dc5164 --- /dev/null +++ b/assets/js/69.f8ef2c05.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{712:function(s,t,a){"use strict";a.r(t);var n=a(7),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("h2",{attrs:{id:"commonjs-模块化规范"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#commonjs-模块化规范"}},[s._v("#")]),s._v(" CommonJS 模块化规范")]),s._v(" "),a("div",{staticClass:"language-javascript line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 导出模块")]),s._v("\nmodule"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("exports "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 导入模块")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("const")]),s._v(" m "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"./modules/m1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("const")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" y "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("require")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"./modules/m2"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("h2",{attrs:{id:"es6-模块化规范"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#es6-模块化规范"}},[s._v("#")]),s._v(" ES6 模块化规范")]),s._v(" "),a("div",{staticClass:"language-javascript line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-javascript"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 导出模块")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("export")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("function")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("func")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("export")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("export")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("default")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("// 导入模块")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" m "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"./modules/m1.js"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("import")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" y "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("from")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v('"./modules/m2.js"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br")])]),a("p",[a("a",{attrs:{href:"https://segmentfault.com/a/1190000017466120",target:"_blank",rel:"noopener noreferrer"}},[s._v("前端模块化详解(完整版)"),a("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/70.af132b44.js b/assets/js/70.af132b44.js new file mode 100644 index 00000000..e28e0e82 --- /dev/null +++ b/assets/js/70.af132b44.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{716:function(s,t,a){"use strict";a.r(t);var n=a(7),e=Object(n.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("p",[s._v("webpack,是一个模块打包器。")]),s._v(" "),a("p",[a("a",{attrs:{href:"https://www.npmjs.com/package/webpack",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://www.npmjs.com/package/webpack"),a("OutboundLink")],1)]),s._v(" "),a("p",[a("a",{attrs:{href:"https://webpack.docschina.org/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://webpack.docschina.org/"),a("OutboundLink")],1)]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 全局安装")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" webpack -g\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" webpack-cli -g\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 局部安装")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("npm")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" webpack --save-dev\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br")])]),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[s._v("Lenovo@DESKTOP-IGBS3S6 MINGW64 /f/code/exercise/frondend/module/commonjs\n$ webpack --help\nUsage: webpack "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("entries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("options"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\nAlternative usage to run commands: webpack "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("options"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\nThe build tool "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" modern web applications.\n\nOptions:\n -c, --config "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Provide path to a webpack configuration "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("file")]),s._v(" e.g. ./webpack.config.js.\n --config-name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Name of the configuration to use.\n -m, --merge Merge two or "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("more")]),s._v(" configurations using "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'webpack-merge'")]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\n --env "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Environment passed to the configuration when it is a function. \n --node-env "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Sets process.env.NODE_ENV to the specified value.\n --progress "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" Print compilation progress during build.\n -j, --json "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" Prints result as JSON or store it "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" a file.\n -d, --devtool "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Determine "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("source")]),s._v(" maps to use.\n --no-devtool Do not generate "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("source")]),s._v(" maps.\n --entry "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" The entry point"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(" of your application e.g. ./src/main.js.\n --mode "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Defines the mode to pass to webpack.\n --name "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Name of the configuration. Used when loading multiple configurations.\n -o, --output-path "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Output location of the "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("file")]),s._v(" generated by webpack e.g. ./dist/.\n --stats "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" It instructs webpack on how to treat the stats e.g. verbose.\n --no-stats Disable stats output.\n -t, --target "),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("value"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" Sets the build target e.g. node.\n --no-target Negative "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'target'")]),s._v(" option.\n -w, --watch Watch "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" files changes.\n --no-watch Do not "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("watch")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("file")]),s._v(" changes.\n --watch-options-stdin Stop watching when stdin stream has ended.\n --no-watch-options-stdin Do not stop watching when stdin stream has ended.\n\nGlobal options:\n --color Enable colors on console.\n --no-color Disable colors on console.\n -v, --version Output the version number of "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'webpack'")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'webpack-cli'")]),s._v(" and "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'webpack-dev-server'")]),s._v(" and commands.\n -h, --help "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("verbose"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" Display "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("help")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" commands and options.\n\nCommands:\n build"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("bundle"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("b "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("entries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("options"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" Run webpack "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("default command, can be omitted"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(".\n configtest"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("t "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("config-path"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" Validate a webpack configuration.\n "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("help")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("h "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("command"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("option"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" Display "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("help")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" commands and options.\n info"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("i "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("options"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" Outputs information about your system.\n serve"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("server"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("s "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("entries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" Run the webpack dev server. To see all available options you need to "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'webpack'")]),s._v(",\n "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'webpack-dev-server'")]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\n version"),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("v")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("commands"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" Output the version number of "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'webpack'")]),s._v(", "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'webpack-cli'")]),s._v(" and "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'webpack-dev-server'")]),s._v(" and commands.\n "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("watch")]),a("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v("w "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("entries"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("..")]),s._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("options"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" Run webpack and "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("watch")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" files changes.\n\nTo see list of all supported commands and options run "),a("span",{pre:!0,attrs:{class:"token string"}},[s._v("'webpack --help=verbose'")]),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v("\n\nWebpack documentation: https://webpack.js.org/.\nCLI documentation: https://webpack.js.org/api/cli/.\nMade with ♥ by the webpack team.\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br"),a("span",{staticClass:"line-number"},[s._v("5")]),a("br"),a("span",{staticClass:"line-number"},[s._v("6")]),a("br"),a("span",{staticClass:"line-number"},[s._v("7")]),a("br"),a("span",{staticClass:"line-number"},[s._v("8")]),a("br"),a("span",{staticClass:"line-number"},[s._v("9")]),a("br"),a("span",{staticClass:"line-number"},[s._v("10")]),a("br"),a("span",{staticClass:"line-number"},[s._v("11")]),a("br"),a("span",{staticClass:"line-number"},[s._v("12")]),a("br"),a("span",{staticClass:"line-number"},[s._v("13")]),a("br"),a("span",{staticClass:"line-number"},[s._v("14")]),a("br"),a("span",{staticClass:"line-number"},[s._v("15")]),a("br"),a("span",{staticClass:"line-number"},[s._v("16")]),a("br"),a("span",{staticClass:"line-number"},[s._v("17")]),a("br"),a("span",{staticClass:"line-number"},[s._v("18")]),a("br"),a("span",{staticClass:"line-number"},[s._v("19")]),a("br"),a("span",{staticClass:"line-number"},[s._v("20")]),a("br"),a("span",{staticClass:"line-number"},[s._v("21")]),a("br"),a("span",{staticClass:"line-number"},[s._v("22")]),a("br"),a("span",{staticClass:"line-number"},[s._v("23")]),a("br"),a("span",{staticClass:"line-number"},[s._v("24")]),a("br"),a("span",{staticClass:"line-number"},[s._v("25")]),a("br"),a("span",{staticClass:"line-number"},[s._v("26")]),a("br"),a("span",{staticClass:"line-number"},[s._v("27")]),a("br"),a("span",{staticClass:"line-number"},[s._v("28")]),a("br"),a("span",{staticClass:"line-number"},[s._v("29")]),a("br"),a("span",{staticClass:"line-number"},[s._v("30")]),a("br"),a("span",{staticClass:"line-number"},[s._v("31")]),a("br"),a("span",{staticClass:"line-number"},[s._v("32")]),a("br"),a("span",{staticClass:"line-number"},[s._v("33")]),a("br"),a("span",{staticClass:"line-number"},[s._v("34")]),a("br"),a("span",{staticClass:"line-number"},[s._v("35")]),a("br"),a("span",{staticClass:"line-number"},[s._v("36")]),a("br"),a("span",{staticClass:"line-number"},[s._v("37")]),a("br"),a("span",{staticClass:"line-number"},[s._v("38")]),a("br"),a("span",{staticClass:"line-number"},[s._v("39")]),a("br"),a("span",{staticClass:"line-number"},[s._v("40")]),a("br"),a("span",{staticClass:"line-number"},[s._v("41")]),a("br"),a("span",{staticClass:"line-number"},[s._v("42")]),a("br"),a("span",{staticClass:"line-number"},[s._v("43")]),a("br"),a("span",{staticClass:"line-number"},[s._v("44")]),a("br"),a("span",{staticClass:"line-number"},[s._v("45")]),a("br"),a("span",{staticClass:"line-number"},[s._v("46")]),a("br"),a("span",{staticClass:"line-number"},[s._v("47")]),a("br"),a("span",{staticClass:"line-number"},[s._v("48")]),a("br"),a("span",{staticClass:"line-number"},[s._v("49")]),a("br"),a("span",{staticClass:"line-number"},[s._v("50")]),a("br"),a("span",{staticClass:"line-number"},[s._v("51")]),a("br")])])])}),[],!1,null,null,null);t.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/71.0bf886b8.js b/assets/js/71.0bf886b8.js new file mode 100644 index 00000000..57f3c9b1 --- /dev/null +++ b/assets/js/71.0bf886b8.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{713:function(t,r,v){"use strict";v.r(r);var _=v(7),s=Object(_.a)({},(function(){var t=this,r=t.$createElement,v=t._self._c||r;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("p",[v("a",{attrs:{href:"https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("CompletableFuture"),v("OutboundLink")],1),t._v(":JDK8引入的异步任务编排的类。")]),t._v(" "),v("h2",{attrs:{id:"开启异步任务"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#开启异步任务"}},[t._v("#")]),t._v(" 开启异步任务")]),t._v(" "),v("p",[v("strong",[t._v("runAsync")]),t._v(":无返回值")]),t._v(" "),v("p",[v("strong",[t._v("supplyAsync")]),t._v(":有返回值")]),t._v(" "),v("h2",{attrs:{id:"异步任务回调"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#异步任务回调"}},[t._v("#")]),t._v(" 异步任务回调")]),t._v(" "),v("p",[v("strong",[t._v("thenApply")]),t._v(":有参数有返回值")]),t._v(" "),v("p",[v("strong",[t._v("thenAccept")]),t._v(":有参数无返回值")]),t._v(" "),v("p",[v("strong",[t._v("thenRun")]),t._v(":无参数无返回值")]),t._v(" "),v("p",[v("strong",[t._v("thenXxx")]),t._v(":不开启新线程,thenXxxAsync:可能开启新线程且可以指定自定义线程池")]),t._v(" "),v("h2",{attrs:{id:"异步任务编排"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#异步任务编排"}},[t._v("#")]),t._v(" 异步任务编排")]),t._v(" "),v("p",[v("strong",[t._v("thenCompose")]),t._v(":编排"),v("strong",[t._v("两个有依赖关系")]),t._v("的异步任务,用来连接两个有依赖关系的异步任务,结果由第二个异步任务返回。")]),t._v(" "),v("p",[v("strong",[t._v("thenCombine")]),t._v(":编排"),v("strong",[t._v("两个非依赖关系")]),t._v("的异步任务")]),t._v(" "),v("p",[v("strong",[t._v("allOf")]),t._v(":合并多个异步任务,有多个需要独立并行运行的任务,并在这些"),v("strong",[t._v("任务都完成")]),t._v("之后执行一些操作")]),t._v(" "),v("p",[v("strong",[t._v("anyOf")]),t._v(":合并多个异步任务,有多个需要独立并行运行的任务,"),v("strong",[t._v("任何一个任务完成")]),t._v("之后执行一些操作")]),t._v(" "),v("h2",{attrs:{id:"异步任务交互"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#异步任务交互"}},[t._v("#")]),t._v(" 异步任务交互")]),t._v(" "),v("p",[t._v("异步任务交互指将异步任务获取结果的"),v("strong",[t._v("速度相比较")]),t._v(",按一定的规则("),v("strong",[t._v("先到先用")]),t._v(")进行下一步处理。")]),t._v(" "),v("h2",{attrs:{id:"异步任务异常处理"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#异步任务异常处理"}},[t._v("#")]),t._v(" 异步任务异常处理")]),t._v(" "),v("p",[v("strong",[t._v("exceptionally")]),t._v(":可以理解为 try-catch 的 catch")]),t._v(" "),v("p",[v("strong",[t._v("handle")]),t._v(":可以理解为 try-catch-finally 的 finally")])])}),[],!1,null,null,null);r.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/73.1ca74722.js b/assets/js/73.1ca74722.js new file mode 100644 index 00000000..28329951 --- /dev/null +++ b/assets/js/73.1ca74722.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{719:function(e,t,a){"use strict";a.r(t);var s=a(7),r=Object(s.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("p",[e._v("JDK8: "),a("a",{attrs:{href:"https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html"),a("OutboundLink")],1)]),e._v(" "),a("p",[e._v("JDK17:"),a("a",{attrs:{href:"https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html"),a("OutboundLink")],1)]),e._v(" "),a("h2",{attrs:{id:"java-jar"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#java-jar"}},[e._v("#")]),e._v(" java -jar")]),e._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[e._v("java "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v("options"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v(" -jar "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("jar 文件"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v("args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("."),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n")])]),e._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[e._v("1")]),a("br")])]),a("h3",{attrs:{id:"java-options"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#java-options"}},[e._v("#")]),e._v(" Java Options")]),e._v(" "),a("h4",{attrs:{id:"标准参数"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#标准参数"}},[e._v("#")]),e._v(" 标准参数(-)")]),e._v(" "),a("p",[e._v("所有JVM都必须实现,向下兼容。")]),e._v(" "),a("h4",{attrs:{id:"非标准参数-x"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#非标准参数-x"}},[e._v("#")]),e._v(" 非标准参数(-X)")]),e._v(" "),a("p",[e._v("默认JVM实现,不保证所有JVM实现都满足,不保证向下兼容,选项如有更改, 不另行通知。")]),e._v(" "),a("p",[a("code",[e._v("java -X")]),e._v(" 可以列出不标准的参数")]),e._v(" "),a("h4",{attrs:{id:"非稳定参数-xx"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#非稳定参数-xx"}},[e._v("#")]),e._v(" 非稳定参数(-XX)")]),e._v(" "),a("p",[e._v("各个JVM实现会有所不同,这些都是不稳定的并且不推荐在生产环境中使用。将来可能会随时取消,需要慎重使用,而且如果在新版本有什么改动也不会发布通知。")]),e._v(" "),a("p",[e._v("-XX参数主要用于JVM的调优和debug操作,分两类:")]),e._v(" "),a("ol",[a("li",[a("p",[e._v("布尔类型")]),e._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# 打开/启用name参数")]),e._v("\n-XX:+"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("name"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# 关闭/禁用name参数")]),e._v("\n-XX:-"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("name"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n")])]),e._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[e._v("1")]),a("br"),a("span",{staticClass:"line-number"},[e._v("2")]),a("br"),a("span",{staticClass:"line-number"},[e._v("3")]),a("br"),a("span",{staticClass:"line-number"},[e._v("4")]),a("br")])])]),e._v(" "),a("li",[a("p",[e._v("键值类型")]),e._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# 将name参数值设置为value")]),e._v("\n-XX:"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("name"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">=")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("value"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n")])]),e._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[e._v("1")]),a("br"),a("span",{staticClass:"line-number"},[e._v("2")]),a("br")])])])]),e._v(" "),a("h4",{attrs:{id:"常用参数"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#常用参数"}},[e._v("#")]),e._v(" 常用参数")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("Options")]),e._v(" "),a("th",[e._v("Usage")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[e._v("-Xmn"),a("size")],1),e._v(" "),a("td",[e._v("Sets the initial and maximum size (in bytes) of the heap for the young generation (nursery) in the generational collectors. Append the letter k or K to indicate kilobytes, m or M to indicate megabytes, or g or G to indicate gigabytes. The young generation region of the heap is used for new objects. GC is performed in this region more often than in other regions. If the size for the young generation is too small, then a lot of minor garbage collections are performed. If the size is too large, then only full garbage collections are performed, which can take a long time to complete. It is recommended that you do not set the size for the young generation for the G1 collector, and keep the size for the young generation greater than 25% and less than 50% of the overall heap size for other collectors. The following examples show how to set the initial and maximum size of young generation to 256 MB using various units:"),a("br"),e._v("-Xmn256m"),a("br"),e._v("-Xmn262144k"),a("br"),e._v("-Xmn268435456"),a("br"),e._v("Instead of the -Xmn option to set both the initial and maximum size of the heap for the young generation, you can use -XX:NewSize to set the initial size and -XX:MaxNewSize to set the maximum size.")])]),e._v(" "),a("tr",[a("td",[e._v("-Xms"),a("size")],1),e._v(" "),a("td",[e._v("Sets the minimum and the initial size (in bytes) of the heap. This value must be a multiple of 1024 and greater than 1 MB. Append the letter k or K to indicate kilobytes, m or M to indicate megabytes, or g or G to indicate gigabytes. The following examples show how to set the size of allocated memory to 6 MB using various units:"),a("br"),e._v("-Xms6291456"),a("br"),e._v("-Xms6144k"),a("br"),e._v("-Xms6m"),a("br"),e._v("If you do not set this option, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation. The initial size of the heap for the young generation can be set using the -Xmn option or the -XX:NewSize option."),a("br"),e._v("Note that the -XX:InitalHeapSize option can also be used to set the initial heap size. If it appears after -Xms on the command line, then the initial heap size gets set to the value specified with -XX:InitalHeapSize.")])]),e._v(" "),a("tr",[a("td",[e._v("-Xmx"),a("size")],1),e._v(" "),a("td",[e._v("Specifies the maximum size (in bytes) of the heap. This value must be a multiple of 1024 and greater than 2 MB. Append the letter k or K to indicate kilobytes, m or M to indicate megabytes, or g or G to indicate gigabytes. The default value is chosen at runtime based on system configuration. For server deployments, -Xms and -Xmx are often set to the same value. The following examples show how to set the maximum allowed size of allocated memory to 80 MB using various units:"),a("br"),e._v("-Xmx83886080"),a("br"),e._v("-Xmx81920k"),a("br"),e._v("-Xmx80m"),a("br"),e._v("The -Xmx option is equivalent to -XX:MaxHeapSize.")])]),e._v(" "),a("tr",[a("td",[e._v("-XX:+HeapDumpOnOutOfMemoryError")]),e._v(" "),a("td",[e._v("Enables the dumping of the Java heap to a file in the current directory by using the heap profiler (HPROF) when a java.lang.OutOfMemoryError exception is thrown. You can explicitly set the heap dump file path and name using the -XX:HeapDumpPath option. By default, this option is disabled and the heap isn't dumped when an OutOfMemoryError exception is thrown.")])]),e._v(" "),a("tr",[a("td",[e._v("-XX:HeapDumpPath=path")]),e._v(" "),a("td",[e._v("Sets the path and file name for writing the heap dump provided by the heap profiler (HPROF) when the -XX:+HeapDumpOnOutOfMemoryError option is set. By default, the file is created in the current working directory, and it's named java_pid"),a("pid",[e._v(".hprof where "),a("pid",[e._v(" is the identifier of the process that caused the error.")])],1)],1)])])]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("JDK8")]),e._v(" "),a("th",[e._v("JDK17")]),e._v(" "),a("th",[e._v("Usage")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[e._v("-XX:+PrintGC")]),e._v(" "),a("td",[e._v("-Xlog:gc")]),e._v(" "),a("td",[e._v("Enables printing of messages at every GC. "),a("br"),e._v("By default, this option is disabled.")])])])]),e._v(" "),a("h3",{attrs:{id:"application-args"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#application-args"}},[e._v("#")]),e._v(" Application args")]),e._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# SpringBoot非选项参数")]),e._v("\njava -jar "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("jar 文件"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" abc def\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# SpringBoot选项参数")]),e._v("\njava -jar "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("jar 文件"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v(" --server.port"),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("8080")]),e._v("\n")])]),e._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[e._v("1")]),a("br"),a("span",{staticClass:"line-number"},[e._v("2")]),a("br"),a("span",{staticClass:"line-number"},[e._v("3")]),a("br"),a("span",{staticClass:"line-number"},[e._v("4")]),a("br")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/76.ba4612f9.js b/assets/js/76.ba4612f9.js new file mode 100644 index 00000000..66547a22 --- /dev/null +++ b/assets/js/76.ba4612f9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{728:function(t,s,a){"use strict";a.r(s);var n=a(7),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("Java8特性,Stream流式计算是对集合Collection对象功能的增强,它专注于对集合对象进行聚合操作或者大批量数据操作。")]),t._v(" "),a("ul",[a("li",[a("p",[a("strong",[t._v("集合Collection,是一种静态的内存数据结构,面向内存,存储在内存中。")])])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("流Stream,是有关计算的,面向CPU,通过CPU实现计算。")])])]),t._v(" "),a("li",[a("p",[t._v("流Stream,它自己不会存储元素。")])]),t._v(" "),a("li",[a("p",[t._v("流Stream,不会改变源对象。相反,它们会返回一个持有结果的新Stream。")])]),t._v(" "),a("li",[a("p",[a("strong",[t._v("流Stream,操作是延迟执行的。一旦执行终止操作,就执行中间操作链,并产生结果。之后,它不能再被使用。")])])])]),t._v(" "),a("h2",{attrs:{id:"创建流"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#创建流"}},[t._v("#")]),t._v(" 创建流")]),t._v(" "),a("p",[t._v("方式一:集合接口的方法。")]),t._v(" "),a("ul",[a("li",[t._v("stream() − 为集合创建串行流。")]),t._v(" "),a("li",[t._v("parallelStream() − 为集合创建并行流。")])]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// stream()")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Stream")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Person")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" stream "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" persons"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br")])]),a("p",[t._v("方式二:Stream的静态方法。")]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Stream.of(...)")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Stream")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" integerStream "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("of")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br")])]),a("h2",{attrs:{id:"中间操作"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#中间操作"}},[t._v("#")]),t._v(" 中间操作")]),t._v(" "),a("p",[t._v("过滤")]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// filter")]),t._v("\npersons"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAge")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br")])]),a("p",[t._v("映射")]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// map")]),t._v("\nstrings"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("map")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("s "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),t._v(" s"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toUpperCase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br")])]),a("p",[t._v("截取")]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// limit 取前N个元素")]),t._v("\npersons"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("limit")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// skip 跳过前N个元素")]),t._v("\npersons"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("skip")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br")])]),a("p",[t._v("排序")]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 自然排序")]),t._v("\nstrings"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sorted")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// 定制排序")]),t._v("\npersons"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sorted")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("p2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Integer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("compare")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAge")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("p2"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAge")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br")])]),a("p",[t._v("去重")]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v("strings"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("distinct")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("h2",{attrs:{id:"终止操作"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#终止操作"}},[t._v("#")]),t._v(" 终止操作")]),t._v(" "),a("p",[t._v("迭代")]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// forEach")]),t._v("\npersons"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAge")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("forEach")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("::")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br")])]),a("p",[t._v("计数")]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v("persons"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAge")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("count")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br")])]),a("p",[a("strong",[t._v("Collectors")])]),t._v(" "),a("p",[a("strong",[t._v("Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。")])]),t._v(" "),a("div",{staticClass:"language-java line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-java"}},[a("code",[t._v("persons"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("filter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("p "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("->")]),t._v(" p"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("getAge")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("collect")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Collectors")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("toList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("List")]),a("span",{pre:!0,attrs:{class:"token generics"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("String")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" stringList "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Arrays")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("asList")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"hello"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"world"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("println")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("stringList"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("stream")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("collect")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Collectors")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("joining")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('","')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])]),t._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[t._v("1")]),a("br"),a("span",{staticClass:"line-number"},[t._v("2")]),a("br"),a("span",{staticClass:"line-number"},[t._v("3")]),a("br"),a("span",{staticClass:"line-number"},[t._v("4")]),a("br")])]),a("h2",{attrs:{id:"参考资料"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#参考资料"}},[t._v("#")]),t._v(" 参考资料")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://www.runoob.com/java/java8-streams.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Java 8 Stream"),a("OutboundLink")],1)])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/77.23805fa7.js b/assets/js/77.23805fa7.js new file mode 100644 index 00000000..3076d6d8 --- /dev/null +++ b/assets/js/77.23805fa7.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{726:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s.$createElement,t=s._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("p",[s._v("可以使用 "),t("a",{attrs:{href:"https://github.com/electerm/electerm/releases",target:"_blank",rel:"noopener noreferrer"}},[s._v("electerm"),t("OutboundLink")],1),s._v("、Xshell 连接 Linux 系统。")]),s._v(" "),t("h2",{attrs:{id:"系统管理"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#系统管理"}},[s._v("#")]),s._v(" 系统管理")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重启")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("reboot")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 关机")]),s._v("\npoweroff\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看操作系统信息")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("uname")]),s._v(" -a\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看磁盘使用情况")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("df")]),s._v(" -hl\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看内存使用情况")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("cat")]),s._v(" /proc/meminfo\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("free")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("free")]),s._v(" -h\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("free")]),s._v(" -g\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 清理缓存")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" /proc/sys/vm/drop_caches\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br")])]),t("h3",{attrs:{id:"进程管理"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#进程管理"}},[s._v("#")]),s._v(" 进程管理")]),s._v(" "),t("p",[s._v("ps (英文全拼:process status)命令用于显示进程的状态。")]),s._v(" "),t("h4",{attrs:{id:"查找进程"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#查找进程"}},[s._v("#")]),s._v(" 查找进程")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看所有进程")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ps")]),s._v(" aux\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ps")]),s._v(" -le\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查找指定进程")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ps")]),s._v(" -ef "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" 关键字\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 以树状图显示进程间的关系")]),s._v("\npstree -p\npstree -p "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" 关键字\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br")])]),t("h4",{attrs:{id:"查看系统健康状态"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#查看系统健康状态"}},[s._v("#")]),s._v(" 查看系统健康状态")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("top")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("选项"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("table",[t("thead",[t("tr",[t("th",[s._v("选项")]),s._v(" "),t("th",[s._v("说明")])])]),s._v(" "),t("tbody",[t("tr",[t("td",[s._v("-d 秒数")]),s._v(" "),t("td",[s._v("指定top命令每隔几秒更新。默认是3秒")])])])]),s._v(" "),t("p",[s._v("在top交互模式下可以执行以下命令")]),s._v(" "),t("table",[t("thead",[t("tr",[t("th",[s._v("命令")]),s._v(" "),t("th",[s._v("说明")])])]),s._v(" "),t("tbody",[t("tr",[t("td",[s._v("?或h")]),s._v(" "),t("td",[s._v("显示交互模式的帮助")])]),s._v(" "),t("tr",[t("td",[s._v("P")]),s._v(" "),t("td",[s._v("以CPU使用率排序,默认是此项")])]),s._v(" "),t("tr",[t("td",[s._v("M")]),s._v(" "),t("td",[s._v("以内存使用率排序")])]),s._v(" "),t("tr",[t("td",[s._v("N")]),s._v(" "),t("td",[s._v("以PID排序")])]),s._v(" "),t("tr",[t("td",[s._v("q")]),s._v(" "),t("td",[s._v("退出top")])])])]),s._v(" "),t("h4",{attrs:{id:"终止进程"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#终止进程"}},[s._v("#")]),s._v(" 终止进程")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看进程可用信号")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("kill")]),s._v(" -l\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 强制终止进程")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("kill")]),s._v(" -9 pid\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("killall")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("pkill")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br")])]),t("h3",{attrs:{id:"工作管理"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#工作管理"}},[s._v("#")]),s._v(" 工作管理")]),s._v(" "),t("p",[s._v("将进程放在后台的方式:")]),s._v(" "),t("ol",[t("li",[s._v("在命令后面加 &,此方式该命令后台运行")]),s._v(" "),t("li",[s._v("执行命令后,按Ctrl+Z,此方式该命令后台暂停")])]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看所有工作进程")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("jobs")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("jobs")]),s._v(" -l\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将后台暂停的工作进程恢复到前台运行")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("fg")]),s._v(" 工作号\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 将后台暂停的工作进程恢复到后台运行")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("bg")]),s._v(" 工作号\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br")])]),t("h3",{attrs:{id:"定时任务"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#定时任务"}},[s._v("#")]),s._v(" 定时任务")]),s._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/qq_22172133/article/details/81263736",target:"_blank",rel:"noopener noreferrer"}},[s._v("Linux的基本操作——crond定时任务"),t("OutboundLink")],1)]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[s._v("yum "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" crontabs\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装服务")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" crond status\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看状态\t")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" crond start\t\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动服务")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" crond stop\t\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 关闭服务")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" crond restart\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重启服务")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" crond reload\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重新载入配置")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br")])]),t("p",[t("strong",[s._v("系统任务调度")])]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@gitlab ~"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# cat /etc/crontab")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("SHELL")])]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/bin/bash\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("PATH")])]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/sbin:/bin:/usr/sbin:/usr/bin\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("MAILTO")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("root\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# For details see man 4 crontabs")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Example of job definition:")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# .---------------- minute (0 - 59)")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# | .------------- hour (0 - 23)")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# | | .---------- day of month (1 - 31)")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# | | | | |")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# * * * * * user-name command to be executed")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br")])]),t("p",[t("strong",[s._v("用户任务调度")])]),s._v(" "),t("p",[s._v("所有用户定义的任务调度保存在 /var/spool/cron 目录中,以用户名命名。")]),s._v(" "),t("h2",{attrs:{id:"文件管理"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#文件管理"}},[s._v("#")]),s._v(" 文件管理")]),s._v(" "),t("h3",{attrs:{id:"文本分析-awk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#文本分析-awk"}},[s._v("#")]),s._v(" 文本分析 - awk")]),s._v(" "),t("p",[s._v("awk '{print $2}'")]),s._v(" "),t("p",[s._v("$2:表示第二个字段")]),s._v(" "),t("p",[s._v("print $2 : 打印第二个字段")]),s._v(" "),t("p",[s._v("awk '{print $2}' $fileName : 一行一行的读取指定的文件, 以空格作为分隔符,打印第二个字段")]),s._v(" "),t("h3",{attrs:{id:"全局替换-sed"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#全局替换-sed"}},[s._v("#")]),s._v(" 全局替换 - sed")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("sed")]),s._v(" -i "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v("'s/源字符串/新字符串/g'")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("h3",{attrs:{id:"输入输出-tee"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#输入输出-tee"}},[s._v("#")]),s._v(" 输入输出 - tee")]),s._v(" "),t("p",[s._v("读取标准输入数据,并将内容输出到文件")]),s._v(" "),t("p",[s._v("-a 追加,不加表示覆盖")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"test"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tee")]),s._v(" test.txt\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"test"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tee")]),s._v(" -a test.txt\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("h2",{attrs:{id:"文件传输"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#文件传输"}},[s._v("#")]),s._v(" 文件传输")]),s._v(" "),t("h3",{attrs:{id:"scp"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#scp"}},[s._v("#")]),s._v(" scp")]),s._v(" "),t("p",[s._v("Linux scp 命令用于 Linux 之间复制文件和目录。")]),s._v(" "),t("p",[s._v("scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。")]),s._v(" "),t("p",[s._v("scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("scp")]),s._v(" local_file remote_username@remote_ip:remote_folder \n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("scp")]),s._v(" local_file remote_username@remote_ip:remote_file \n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("scp")]),s._v(" local_file remote_ip:remote_folder \n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("scp")]),s._v(" local_file remote_ip:remote_file \n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -P 端口")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -r 递归")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("scp")]),s._v(" -P remote_port local_file remote_username@remote_ip:remote_folder\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("scp")]),s._v(" -P remote_port -r local_folder remote_username@remote_ip:remote_folder\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br")])]),t("h2",{attrs:{id:"搜索命令-find-locate-whereis-which"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#搜索命令-find-locate-whereis-which"}},[s._v("#")]),s._v(" 搜索命令 - find, locate, whereis, which")]),s._v(" "),t("p",[t("strong",[s._v("whereis")]),s._v(" 和 "),t("strong",[s._v("which")]),s._v(" 都是"),t("strong",[s._v("查找可执行文件路径")]),s._v("的命令。")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@linux opt"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# whereis cp")]),s._v("\ncp: /usr/bin/cp /usr/share/man/man1/cp.1.gz\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@linux opt"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# which cp")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("alias")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("cp")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v("'cp -i'")]),s._v("\n /usr/bin/cp\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("h2",{attrs:{id:"eof"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#eof"}},[s._v("#")]),s._v(" EOF, >, >>, <, <<")]),s._v(" "),t("p",[s._v("EOF是END Of File的缩写,表示自定义终止符。")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<<")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v("EOF"),t("span",{pre:!0,attrs:{class:"token bash punctuation"}},[s._v("\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 开始")])]),s._v("\n…\nEOF")]),s._v("\t\t"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 结束")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("< : 输入重定向")]),s._v(" "),t("p",[s._v("<< : 标准输入来自命令行的一对分隔号的中间内容")]),s._v(" "),t("p",[s._v("> : 输出重定向")]),s._v(" "),t("p",[s._v(">> : 输出重定向,进行追加,不会覆盖之前内容")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tee")]),s._v(" /etc/docker/daemon.json "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<<-")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('\'EOF\'\n{\n "registry-mirrors": ["https://4uv4xvt5.mirror.aliyuncs.com"]\n}\nEOF')]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("h2",{attrs:{id:"ssh-ssh-keygen"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ssh-ssh-keygen"}},[s._v("#")]),s._v(" ssh & ssh-keygen")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 连接远程服务器")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ssh")]),s._v(" -p port username@ip\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看安装 ssh-keygen 的程序")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -qf "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("which")]),s._v(" ssh-keygen"),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("`")])]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 生成密钥对")]),s._v("\nssh-keygen\nssh-keygen -t rsa -P "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('""')]),s._v(" -f /root/.ssh/id_rsa\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 发布公钥")]),s._v("\nssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.17\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br")])]),t("p",[s._v("ssh 免密登录,scp免密传输,使用ssh-keygen生成密钥对,然后将公钥发布出去即可。")]),s._v(" "),t("p",[s._v("注意:A服务器连B服务器,在A服务器使用ssh-keygen生成密钥对,然后使用ssh-copy-id将公钥发布到B服务器。")]),s._v(" "),t("h2",{attrs:{id:"grep"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#grep"}},[s._v("#")]),s._v(" grep")]),s._v(" "),t("p",[s._v("grep 用于查找文件里符合条件的字符串。")]),s._v(" "),t("ul",[t("li",[s._v("-v 不显示匹配到的行")])]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" -v 字符串\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("h2",{attrs:{id:"实用脚本"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#实用脚本"}},[s._v("#")]),s._v(" 实用脚本")]),s._v(" "),t("h3",{attrs:{id:"如果文件存在-则删除"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#如果文件存在-则删除"}},[s._v("#")]),s._v(" 如果文件存在,则删除")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("log_path")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/opt/webapp/uuap-api-ssh/log.log\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" -f log_path "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v(" \n\t"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rm")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${log_path}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" \n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("h3",{attrs:{id:"如果目录不存在-则创建"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#如果目录不存在-则创建"}},[s._v("#")]),s._v(" 如果目录不存在,则创建")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("backup_path")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/opt/webapp_backup/uuap-api-ssh/"),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${BUILD_NUMBER}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v(" -d "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${backup_path}")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" -p "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${backup_path}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br")])]),t("h2",{attrs:{id:"相关链接"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#相关链接"}},[s._v("#")]),s._v(" 相关链接")]),s._v(" "),t("p",[t("a",{attrs:{href:"https://mirrors.aliyun.com/gnu/",target:"_blank",rel:"noopener noreferrer"}},[s._v("阿里云开源镜像站"),t("OutboundLink")],1)]),s._v(" "),t("p",[t("a",{attrs:{href:"https://www.bilibili.com/video/BV1mW411i7Qf",target:"_blank",rel:"noopener noreferrer"}},[s._v("史上最牛的Linux视频教程—兄弟连"),t("OutboundLink")],1)])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/78.02c62083.js b/assets/js/78.02c62083.js new file mode 100644 index 00000000..95d8c2c3 --- /dev/null +++ b/assets/js/78.02c62083.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{727:function(s,e,a){"use strict";a.r(e);var t=a(7),_=Object(t.a)({},(function(){var s=this,e=s.$createElement,a=s._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("p",[a("code",[s._v("cp")]),s._v(" 只能在本地硬盘中进行文件复制。")]),s._v(" "),a("p",[a("code",[s._v("rcp")]),s._v("(远程复制)和 "),a("code",[s._v("scp")]),s._v("(安全复制)都是用于不同主机之间传输文件的命令行工具。")]),s._v(" "),a("p",[a("code",[s._v("rcp")]),s._v(" 是一种基于传统的 UNIX(远程shell)协议的文件复制工具。它使用不加密的传输方式,将文件从一个主机复制到另一个主机。由于缺乏加密, "),a("code",[s._v("rcp")]),s._v(" 在网络中传输的数据是明文的,容易受到窃听和篡改的风险。")]),s._v(" "),a("p",[a("code",[s._v("scp")]),s._v("(secure copy)是在 "),a("code",[s._v("rcp")]),s._v(" 的基础上发展而来的工具,它使用 SSH(Secure Shell)协议进行安全的文件复制。通过使用 SSH,"),a("code",[s._v("scp")]),s._v(" 在传输文件时会进行加密,确保数据的机密性和完整性。它提供了与 "),a("code",[s._v("rcp")]),s._v(" 类似的命令行接口,但在传输文件时更加安全可靠。")]),s._v(" "),a("h2",{attrs:{id:"scp-跨机远程拷贝"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#scp-跨机远程拷贝"}},[s._v("#")]),s._v(" scp 跨机远程拷贝")]),s._v(" "),a("h3",{attrs:{id:"命令格式"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#命令格式"}},[s._v("#")]),s._v(" 命令格式")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[s._v("scp")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("参数"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("原路径"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("目标路径"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br")])]),a("h3",{attrs:{id:"命令参数"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#命令参数"}},[s._v("#")]),s._v(" 命令参数")]),s._v(" "),a("ul",[a("li",[s._v("-1 强制scp命令使用协议ssh1")]),s._v(" "),a("li",[s._v("-2 强制scp命令使用协议ssh2")]),s._v(" "),a("li",[s._v("-4 强制scp命令只使用IPv4寻址")]),s._v(" "),a("li",[s._v("-6 强制scp命令只使用IPv6寻址")]),s._v(" "),a("li",[s._v("-B 使用批处理模式(传输过程中不询问传输口令或短语)")]),s._v(" "),a("li",[s._v("-C 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)")]),s._v(" "),a("li",[s._v("-p 留原文件的修改时间,访问时间和访问权限。")]),s._v(" "),a("li",[s._v("-q 不显示传输进度条。")]),s._v(" "),a("li",[s._v("-r 递归复制整个目录。")]),s._v(" "),a("li",[s._v("-v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。")]),s._v(" "),a("li",[s._v("-c cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh。")]),s._v(" "),a("li",[s._v("-F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh。")]),s._v(" "),a("li",[s._v("-i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。")]),s._v(" "),a("li",[s._v("-l limit 限定用户所能使用的带宽,以Kbit/s为单位。")]),s._v(" "),a("li",[s._v("-o ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式,")]),s._v(" "),a("li",[s._v("-P port 注意是大写的P, port是指定数据传输用到的端口号")]),s._v(" "),a("li",[s._v("-S program 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。")])]),s._v(" "),a("h3",{attrs:{id:"使用说明"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#使用说明"}},[s._v("#")]),s._v(" 使用说明")]),s._v(" "),a("p",[s._v("从本地服务器复制文件到远程服务器:")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$scp")]),s._v(" local_file remote_username@remote_ip:remote_folder\n"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$scp")]),s._v(" local_file remote_username@remote_ip:remote_file\n"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$scp")]),s._v(" local_file remote_ip:remote_folder\n"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$scp")]),s._v(" local_file remote_ip:remote_file\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br"),a("span",{staticClass:"line-number"},[s._v("3")]),a("br"),a("span",{staticClass:"line-number"},[s._v("4")]),a("br")])]),a("p",[s._v("从本地服务器复制目录到远程服务器:")]),s._v(" "),a("div",{staticClass:"language-shell line-numbers-mode"},[a("pre",{pre:!0,attrs:{class:"language-shell"}},[a("code",[a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$scp")]),s._v(" -r local_folder remote_username@remote_ip:remote_folder\n"),a("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$scp")]),s._v(" -r local_folder remote_ip:remote_folder\n")])]),s._v(" "),a("div",{staticClass:"line-numbers-wrapper"},[a("span",{staticClass:"line-number"},[s._v("1")]),a("br"),a("span",{staticClass:"line-number"},[s._v("2")]),a("br")])]),a("p",[s._v("如果指定了用户名,命令执行后需要输入密码;")]),s._v(" "),a("p",[s._v("如果不指定用户名,命令执行后需要输入用户名和密码;")]),s._v(" "),a("p",[s._v("从远程服务器复制文件或目录到本地服务器的命令与上述命令基本一致,只要将后面2个参数互换顺序即可。")])])}),[],!1,null,null,null);e.default=_.exports}}]); \ No newline at end of file diff --git a/assets/js/79.f38c0f0f.js b/assets/js/79.f38c0f0f.js new file mode 100644 index 00000000..60413866 --- /dev/null +++ b/assets/js/79.f38c0f0f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{729:function(s,n,t){"use strict";t.r(n);var a=t(7),e=Object(a.a)({},(function(){var s=this,n=s.$createElement,t=s._self._c||n;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("p",[s._v("The File Transfer Protocol (FTP) is a simple network protocol that lets you transfer files between two computers on the Internet.")]),s._v(" "),t("p",[s._v("FTPS stands for “FTP over SSL”.")]),s._v(" "),t("h2",{attrs:{id:"sftp"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sftp"}},[s._v("#")]),s._v(" SFTP")]),s._v(" "),t("h3",{attrs:{id:"在centos7安装sftp服务器"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#在centos7安装sftp服务器"}},[s._v("#")]),s._v(" 在CentOS7安装SFTP服务器")]),s._v(" "),t("p",[s._v("在CentOS7中,sftp只是ssh的一部分,所以采用yum来安装ssh服务即可。")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看是否安装SSH")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("ssh")]),s._v(" -V\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装ssh")]),s._v("\nyum "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -y openssl openssh-server\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ssh的服务名是sshd,相关的操作如下:")]),s._v("\nsystemctl stop sshd.service "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 停止sshd服务")]),s._v("\nsystemctl restart sshd.service "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重启sshd服务")]),s._v("\nsystemctl status sshd.service "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看sshd服务状态")]),s._v("\nsystemctl "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" sshd.service "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 设置开机自启动sshd服务")]),s._v("\nsystemctl disable sshd.service "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 禁用开机自启动sshd服务")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 新建SFTP目录并授权")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" -p /data/sftp/sftpuser\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" root:root /data/sftp/sftpuser\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("755")]),s._v(" /data/sftp/sftpuser\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 新建用户组sftp")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("groupadd")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("sftp")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 新建用户sftpuser,并且设置不支持ssh系统登录,只能登录sftp服务器")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -g 用户组; -d 指定家目录; -s 不能登陆系统; -M 不创建家目录")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("useradd")]),s._v(" -g "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("sftp")]),s._v(" -d /data/sftp/sftpuser -M -s /sbin/nologin sftpuser\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 设置密码")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# echo "新密码" | passwd --stdin 用户名')]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"sftpuser"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("passwd")]),s._v(" --stdin sftpuser\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 由于/data/sftp/sftpuser的用户是root,其它用户都没有写的权限")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 所以要在该目录下新建一个目录用于文件的上传下载")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" -p /data/sftp/sftpuser/upload\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("chown")]),s._v(" sftpuser:sftp /data/sftp/sftpuser/upload\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("755")]),s._v(" /data/sftp/sftpuser/upload\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置SSH和SFTP服务器")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" /etc/ssh/sshd_config /etc/ssh/sshd_config.backup\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /etc/ssh/sshd_config\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置SSH")]),s._v("\nPermitRootLogin "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("yes")]),s._v("\nRSAAuthentication "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("yes")]),s._v("\nPubkeyAuthentication "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("yes")]),s._v("\nAuthorizedKeysFile\t.ssh/authorized_keys\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置SFTP")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 注释掉这行")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Subsystem sftp /usr/libexec/openssh/sftp-server")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 文件末尾添加以下内容")]),s._v("\nSubsystem "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("sftp")]),s._v(" internal-sftp\nMatch Group "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("sftp")]),s._v("\nChrootDirectory /data/sftp/%u\nForceCommand internal-sftp\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 下面两项是与安全有关")]),s._v("\nAllowTcpForwarding no\nX11Forwarding no\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 关闭Selinux策略")]),s._v("\nsetsebool -P ftpd_full_access on\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("sed")]),s._v(" -i s"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#enforcing#disabled#g /etc/sysconfig/selinux")]),s._v("\nsetenforce "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("0")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" getenforce\ngetenforce\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重启SFTP服务")]),s._v("\nsystemctl restart sshd.service\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 本机测试SFTP")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@sftpserver upload"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# sftp sftpuser:sftpuser@192.168.1.28")]),s._v("\nsftpuser:sftpuser@192.168.1.28's password:\nConnected to "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".1.28.\nsftp"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("pwd")]),s._v("\nRemote working directory: /\nsftp"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" upload/\nsftp"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("pwd")]),s._v("\nRemote working directory: /upload\nsftp"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exit")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br"),t("span",{staticClass:"line-number"},[s._v("39")]),t("br"),t("span",{staticClass:"line-number"},[s._v("40")]),t("br"),t("span",{staticClass:"line-number"},[s._v("41")]),t("br"),t("span",{staticClass:"line-number"},[s._v("42")]),t("br"),t("span",{staticClass:"line-number"},[s._v("43")]),t("br"),t("span",{staticClass:"line-number"},[s._v("44")]),t("br"),t("span",{staticClass:"line-number"},[s._v("45")]),t("br"),t("span",{staticClass:"line-number"},[s._v("46")]),t("br"),t("span",{staticClass:"line-number"},[s._v("47")]),t("br"),t("span",{staticClass:"line-number"},[s._v("48")]),t("br"),t("span",{staticClass:"line-number"},[s._v("49")]),t("br"),t("span",{staticClass:"line-number"},[s._v("50")]),t("br"),t("span",{staticClass:"line-number"},[s._v("51")]),t("br"),t("span",{staticClass:"line-number"},[s._v("52")]),t("br"),t("span",{staticClass:"line-number"},[s._v("53")]),t("br"),t("span",{staticClass:"line-number"},[s._v("54")]),t("br"),t("span",{staticClass:"line-number"},[s._v("55")]),t("br"),t("span",{staticClass:"line-number"},[s._v("56")]),t("br"),t("span",{staticClass:"line-number"},[s._v("57")]),t("br"),t("span",{staticClass:"line-number"},[s._v("58")]),t("br"),t("span",{staticClass:"line-number"},[s._v("59")]),t("br"),t("span",{staticClass:"line-number"},[s._v("60")]),t("br"),t("span",{staticClass:"line-number"},[s._v("61")]),t("br"),t("span",{staticClass:"line-number"},[s._v("62")]),t("br"),t("span",{staticClass:"line-number"},[s._v("63")]),t("br"),t("span",{staticClass:"line-number"},[s._v("64")]),t("br"),t("span",{staticClass:"line-number"},[s._v("65")]),t("br"),t("span",{staticClass:"line-number"},[s._v("66")]),t("br"),t("span",{staticClass:"line-number"},[s._v("67")]),t("br"),t("span",{staticClass:"line-number"},[s._v("68")]),t("br"),t("span",{staticClass:"line-number"},[s._v("69")]),t("br"),t("span",{staticClass:"line-number"},[s._v("70")]),t("br")])])])}),[],!1,null,null,null);n.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/81.7a9b0490.js b/assets/js/81.7a9b0490.js new file mode 100644 index 00000000..183c69cf --- /dev/null +++ b/assets/js/81.7a9b0490.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{733:function(s,a,t){"use strict";t.r(a);var n=t(7),e=Object(n.a)({},(function(){var s=this,a=s.$createElement,t=s._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("p",[s._v("打包指定文件夹脚本")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token shebang important"}},[s._v("#!/bin/bash")]),s._v("\n \n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查输入参数个数")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$#")]),s._v('"')]),s._v(" -ne "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("2")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Usage: '),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$0")]),s._v(' "')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exit")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n \n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 获取输入参数")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("SOURCE_FOLDER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$1")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("DESTINATION_FILE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$2")]),s._v("\n \n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查源文件夹是否存在")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("!")]),s._v(" -d "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$SOURCE_FOLDER")]),s._v('"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Error: Source folder does not exist."')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exit")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n \n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 压缩文件夹")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -czf "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$DESTINATION_FILE")]),s._v(" -C "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("dirname")]),s._v(" $SOURCE_FOLDER"),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("basename")]),s._v(" $SOURCE_FOLDER"),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v("\n \n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v("\"Folder '"),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$SOURCE_FOLDER")]),s._v("' has been packaged as '"),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$DESTINATION_FILE")]),s._v("'.\"")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br")])]),t("p",[s._v("遍历指定文件夹并执行脚本")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token shebang important"}},[s._v("#!/bin/bash")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 指定目录")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("DIRECTORY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v("'/path/to/your/directory'")]),s._v("\n \n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 遍历指定目录下的所有文件和文件夹")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token for-or-select variable"}},[s._v("file")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$DIRECTORY")]),s._v('"')]),s._v("/*\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("do")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查是否是文件")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" -f "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$file")]),s._v('"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查文件扩展名是否为.sh(如果需要其他扩展名,请相应修改)")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$file")]),s._v('"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" *.sh "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 赋予执行权限")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("chmod")]),s._v(" ug+x "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$file")]),s._v('"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 执行文件")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"正在执行 '),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$file")]),s._v('"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("sh")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$file")]),s._v('"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("done")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br")])]),t("p",[s._v("根据当前用户遍历指定文件夹并执行脚本")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token shebang important"}},[s._v("#!/bin/bash")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 获取当前用户")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("currentUser")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("whoami")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v(")")])]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 指定目录")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("BASE_DIRECTORY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v("'/path/to/your/directory'")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${currentUser}")]),s._v('"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"javadm"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n\t"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("DIRECTORY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${BASE_DIRECTORY}")]),s._v('/javadm"')]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("elif")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${currentUser}")]),s._v('"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"appadm"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n\t"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("DIRECTORY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${BASE_DIRECTORY}")]),s._v('/appadm"')]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v("\n\t"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Invalid user: '),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${currentUser}")]),s._v('"')]),s._v("\n\t"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exit")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" -d "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${DIRECTORY}")]),s._v('"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"Prepare to execute the script for the '),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("${DIRECTORY}")]),s._v(' directory"')]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("else")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"No such file or directory"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("exit")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n \n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 遍历指定目录下的所有文件和文件夹")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("for")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token for-or-select variable"}},[s._v("file")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("in")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$DIRECTORY")]),s._v('"')]),s._v("/*\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("do")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查是否是文件")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" -f "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$file")]),s._v('"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查文件扩展名是否为.sh(如果需要其他扩展名,请相应修改)")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("if")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$file")]),s._v('"')]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),s._v(" *.sh "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("then")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 赋予执行权限")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v('# chmod ug+x "$file"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 执行文件")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("echo")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"正在执行 '),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$file")]),s._v('"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("sh")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$file")]),s._v('"')]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("fi")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("done")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br"),t("span",{staticClass:"line-number"},[s._v("13")]),t("br"),t("span",{staticClass:"line-number"},[s._v("14")]),t("br"),t("span",{staticClass:"line-number"},[s._v("15")]),t("br"),t("span",{staticClass:"line-number"},[s._v("16")]),t("br"),t("span",{staticClass:"line-number"},[s._v("17")]),t("br"),t("span",{staticClass:"line-number"},[s._v("18")]),t("br"),t("span",{staticClass:"line-number"},[s._v("19")]),t("br"),t("span",{staticClass:"line-number"},[s._v("20")]),t("br"),t("span",{staticClass:"line-number"},[s._v("21")]),t("br"),t("span",{staticClass:"line-number"},[s._v("22")]),t("br"),t("span",{staticClass:"line-number"},[s._v("23")]),t("br"),t("span",{staticClass:"line-number"},[s._v("24")]),t("br"),t("span",{staticClass:"line-number"},[s._v("25")]),t("br"),t("span",{staticClass:"line-number"},[s._v("26")]),t("br"),t("span",{staticClass:"line-number"},[s._v("27")]),t("br"),t("span",{staticClass:"line-number"},[s._v("28")]),t("br"),t("span",{staticClass:"line-number"},[s._v("29")]),t("br"),t("span",{staticClass:"line-number"},[s._v("30")]),t("br"),t("span",{staticClass:"line-number"},[s._v("31")]),t("br"),t("span",{staticClass:"line-number"},[s._v("32")]),t("br"),t("span",{staticClass:"line-number"},[s._v("33")]),t("br"),t("span",{staticClass:"line-number"},[s._v("34")]),t("br"),t("span",{staticClass:"line-number"},[s._v("35")]),t("br"),t("span",{staticClass:"line-number"},[s._v("36")]),t("br"),t("span",{staticClass:"line-number"},[s._v("37")]),t("br"),t("span",{staticClass:"line-number"},[s._v("38")]),t("br")])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/82.d1005bbb.js b/assets/js/82.d1005bbb.js new file mode 100644 index 00000000..4e42a303 --- /dev/null +++ b/assets/js/82.d1005bbb.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[82],{734:function(t,e,n){"use strict";n.r(e);var s=n(7),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/83.2182e7ba.js b/assets/js/83.2182e7ba.js new file mode 100644 index 00000000..a32f66e9 --- /dev/null +++ b/assets/js/83.2182e7ba.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[83],{737:function(t,s,n){"use strict";n.r(s);var a=n(7),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[n("a",{attrs:{href:"https://activemq.apache.org/getting-started",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://activemq.apache.org/getting-started"),n("OutboundLink")],1)]),t._v(" "),n("div",{staticClass:"language-sh line-numbers-mode"},[n("pre",{pre:!0,attrs:{class:"language-sh"}},[n("code",[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("whereis")]),t._v(" activemq\n\n"),n("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" /usr/local/activemq/bin\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Starting ActiveMQ")]),t._v("\n./activemq start\n\n"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Stopping ActiveMQ")]),t._v("\n./activemq stop\n")])]),t._v(" "),n("div",{staticClass:"line-numbers-wrapper"},[n("span",{staticClass:"line-number"},[t._v("1")]),n("br"),n("span",{staticClass:"line-number"},[t._v("2")]),n("br"),n("span",{staticClass:"line-number"},[t._v("3")]),n("br"),n("span",{staticClass:"line-number"},[t._v("4")]),n("br"),n("span",{staticClass:"line-number"},[t._v("5")]),n("br"),n("span",{staticClass:"line-number"},[t._v("6")]),n("br"),n("span",{staticClass:"line-number"},[t._v("7")]),n("br"),n("span",{staticClass:"line-number"},[t._v("8")]),n("br"),n("span",{staticClass:"line-number"},[t._v("9")]),n("br")])]),n("p",[t._v("URL: http://192.168.1.19:8161/admin/\nLogin: admin\nPasswort: admin")])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/84.fa969363.js b/assets/js/84.fa969363.js new file mode 100644 index 00000000..b6f73123 --- /dev/null +++ b/assets/js/84.fa969363.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[84],{738:function(s,a,e){"use strict";e.r(a);var t=e(7),n=Object(t.a)({},(function(){var s=this,a=s.$createElement,e=s._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("p",[s._v("Web服务器一般指网站服务器,是指驻留于互联网的某种计算机程序,向浏览器等Web客户端提供文档。它既可以放置网站文件,让全世界浏览;也可以放置数据文件,让全世界下载。服务器使用HTTP(超文本传输协议)与客户端浏览器进行信息交流。")]),s._v(" "),e("p",[s._v("主流的Web服务器有:Apache、Nginx和IIS(Internet Information Services)。")]),s._v(" "),e("h2",{attrs:{id:"apache-的-rpm安装与启动"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#apache-的-rpm安装与启动"}},[s._v("#")]),s._v(" Apache 的 rpm安装与启动")]),s._v(" "),e("p",[s._v("rpm 包的安装简便、速度快、兼容性好,但安装位置固定分散且不可控、版本较老。")]),s._v(" "),e("p",[s._v("使用yum安装Apache")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("yum "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" httpd -y\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("启动Apache")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" httpd restart\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("关闭防火墙")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" ipstables stop\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("h2",{attrs:{id:"apache-的-源码安装与启动"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#apache-的-源码安装与启动"}},[s._v("#")]),s._v(" Apache 的 源码安装与启动")]),s._v(" "),e("p",[s._v("Apache安装需要下载其他依赖源码包。")]),s._v(" "),e("ol",[e("li",[s._v("Apache,Apache HTTP Server,下载地址:"),e("a",{attrs:{href:"https://downloads.apache.org/httpd/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://downloads.apache.org/httpd/"),e("OutboundLink")],1)]),s._v(" "),e("li",[s._v("apr,Apache Portable Runtime,Apache可移植运行库,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。下载地址:"),e("a",{attrs:{href:"https://downloads.apache.org/apr/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://downloads.apache.org/apr/"),e("OutboundLink")],1)]),s._v(" "),e("li",[s._v("apr-util,apr工具。下载地址:"),e("a",{attrs:{href:"https://downloads.apache.org/apr/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://downloads.apache.org/apr/"),e("OutboundLink")],1)]),s._v(" "),e("li",[s._v("pcre,基于perl兼容的正则表达式的支持。下载地址:"),e("a",{attrs:{href:"https://sourceforge.net/projects/pcre/files/pcre/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://sourceforge.net/projects/pcre/files/pcre/"),e("OutboundLink")],1)])]),s._v(" "),e("h3",{attrs:{id:"源码安装apache时如何确定apr版本"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#源码安装apache时如何确定apr版本"}},[s._v("#")]),s._v(" 源码安装Apache时如何确定apr版本")]),s._v(" "),e("p",[s._v("在源代码安装Apache时,确定APR(Apache Portable Runtime)版本通常涉及查看Apache源代码包中的configure.in或configure.ac文件。APR版本信息通常在configure.in文件中以注释的形式出现,或者可以在Apache的官方文档中找到。")]),s._v(" "),e("p",[s._v("以下是查看configure.in文件以确定APR版本的基本步骤:")]),s._v(" "),e("ol",[e("li",[e("p",[s._v("下载Apache源代码。")])]),s._v(" "),e("li",[e("p",[s._v("解压缩源代码包。")])]),s._v(" "),e("li",[e("p",[s._v("查找configure.in或configure.ac文件。")])]),s._v(" "),e("li",[e("p",[s._v("打开文件并查找APR相关的注释或者版本信息。")])])]),s._v(" "),e("p",[s._v("例如,你可以使用grep命令快速搜索APR版本信息:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" apache-source-directory\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[s._v("'APR'")]),s._v(" configure.in\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("p",[s._v("或者,如果是.ac文件:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[s._v("'APR'")]),s._v(" configure.ac\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("在输出中,你应该能找到类似于APR_VERSION的字样,这将告诉你所需的APR版本。")]),s._v(" "),e("p",[s._v("如果你想要编译安装指定版本的APR,你可以从APR的官方网站或者其他可信来源下载所需版本的APR源代码,然后按照APR的安装说明进行编译和安装。")]),s._v(" "),e("p",[s._v("请注意,如果你是在使用预编译的二进制包或者包管理器(如apt或yum)来安装Apache,APR版本通常会被预先决定和安装,你不需要手动确定或选择版本。")]),s._v(" "),e("h3",{attrs:{id:"源码安装apache时如何确定apr-util版本"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#源码安装apache时如何确定apr-util版本"}},[s._v("#")]),s._v(" 源码安装Apache时如何确定apr-util版本")]),s._v(" "),e("p",[s._v("在源代码安装Apache时,确定apr-util版本通常涉及以下步骤:")]),s._v(" "),e("p",[s._v("访问Apache HTTP Server项目的官方网站或者其他可靠资源获取最新的apr-util版本信息。")]),s._v(" "),e("p",[s._v("访问apr-util的下载页面或源代码仓库,以查看可用的版本列表。")]),s._v(" "),e("p",[s._v("如果你是从源代码安装,可以查看Apache HTTP Server源代码包中的configure.in或configure.ac文件,通常这些文件会指定所需的apr-util版本。")]),s._v(" "),e("p",[s._v("如果你是从预编译包安装,可以查看安装指南或文档,这里通常会有版本要求。")]),s._v(" "),e("p",[s._v("如果你是从源代码安装Apache,并且想要找到apr-util的版本,你可以在Apache源代码的configure.in或configure.ac文件中查找APR-UTIL相关的行,例如:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Check for APR-UTIL")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("APR_UTIL_CONFIG")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$withval")]),s._v('"')]),s._v("\nAC_ARG_WITH"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("apr-util"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(",\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("AS_HELP_STRING"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("--with-apr-util"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("PATH")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(",\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("use APR-UTIL, optionally specifying its path"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(",\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("APR_UTIL_CONFIG"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$withval")]),s._v('"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(", "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ... 其他配置代码 ...")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Check for APR-UTIL libraries")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ... 代码检查apr-util库 ...")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br"),e("span",{staticClass:"line-number"},[s._v("9")]),e("br")])]),e("p",[s._v("在这个例子中,--with-apr-util选项可以用来指定apr-util的路径。如果你需要编译安装,通常需要确保你有合适版本的apr-util库和头文件可供编译使用。")]),s._v(" "),e("p",[s._v("如果你是在编译Apache时遇到了版本不匹配的问题,通常错误信息会提示你需要的apr-util版本。此时,你可以下载并安装所需版本的apr-util,或者修改configure脚本以指向正确的apr-util版本。")]),s._v(" "),e("h3",{attrs:{id:"源码安装apache时如何确定pcre版本"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#源码安装apache时如何确定pcre版本"}},[s._v("#")]),s._v(" 源码安装Apache时如何确定pcre版本")]),s._v(" "),e("p",[s._v("在源代码安装Apache时,确定PCRE(Perl Compatible Regular Expressions)版本通常涉及查看Apache源代码包中的配置脚本或INSTALL文件。通常,Apache的源代码包会带有一个configure脚本,你可以通过运行以下命令来检查PCRE的依赖:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("./configure --help\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("查找输出中与PCRE有关的选项,通常会有类似于--with-pcre的选项来指定PCRE的安装路径。如果没有找到相关选项,你可能需要查看INSTALL或README文件获取更多信息。")]),s._v(" "),e("p",[s._v("如果你需要确定当前系统中PCRE的版本,可以使用包管理器查询,例如:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 对于使用apt的Debian/Ubuntu系统")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt-cache")]),s._v(" policy libpcre3 libpcre3-dev\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 对于使用yum的CentOS/RHEL系统")]),s._v("\nyum list installed "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("|")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("grep")]),s._v(" pcre\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 对于使用zypper的SUSE系统")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("zypper")]),s._v(" se pcre\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br")])]),e("p",[s._v("如果你需要安装特定版本的PCRE,可以使用相应的包管理器安装,例如:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 对于Debian/Ubuntu系统")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("apt-get")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" libpcre3 libpcre3-dev\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 对于CentOS/RHEL系统")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" yum "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" pcre pcre-devel\n \n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 对于SUSE系统")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("sudo")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("zypper")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" pcre pcre-devel\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br")])]),e("p",[s._v("确保安装了正确版本的PCRE后,再按照正常流程编译和安装Apache。")]),s._v(" "),e("h3",{attrs:{id:"源码安装与启动apache"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#源码安装与启动apache"}},[s._v("#")]),s._v(" 源码安装与启动Apache")]),s._v(" "),e("p",[s._v("关闭防火墙")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" ipstables stop\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("安装gcc编译器和make")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("yum "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" gcc* "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" -y\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("解压源码包")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -zxf apr-1.6.5.tar.gz\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -zxf apr-util-1.6.3.tar.gz\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -zxf pcre-8.45.tar.gz\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -zxf httpd-2.4.59.tar.gz \n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br")])]),e("p",[s._v("复制apr和apr-util并取消版本号")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("ls")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" -rf apr-1.6.5/ httpd-2.4.59/srclib/apr\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("cp")]),s._v(" -rf apr-util-1.6.3/ httpd-2.4.59/srclib/apr-util\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br")])]),e("p",[s._v("安装pcre")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" pcre-8.45\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 配置(configure)、编译(make)、安装(make install)")]),s._v("\n./configure "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br")])]),e("p",[s._v("配置Apache")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("./configure --prefix"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/usr/local/apache2 --sysconfdir"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/usr/local/apache2/etc --with-included-apr --enable-so --enable-deflate"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("shared --enable-expires"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("shared --enable-rewrite"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("shared\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("参数详解:")]),s._v(" "),e("ul",[e("li",[s._v("--with-included-apr 是一个常见的配置选项,用于指示编译系统将一个版本的APR(Apache Portable Runtime)包含在软件包中。APR是Apache HTTP服务器使用的可移植库,它提供了一种方法来执行常见的操作系统服务,例如进程管理、内存管理和文件操作,而不需要为每个操作系统编写特定的代码。使用--with-included-apr配置选项通常意味着你想要编译的软件包将会包含它自己的APR副本,而不是依赖系统上可能存在的APR。这可以确保软件包在不同的环境中具有良好的兼容性,因为它将使用预定义的APR版本。")]),s._v(" "),e("li",[s._v("--enable-so 是在配置 (configure) Apache HTTP 服务器时使用的参数,用于启用动态加载模块支持(DSO,Dynamic Shared Object)。这个参数允许你在不重新编译整个服务器的情况下,动态地加载或卸载模块。这对于需要在运行中更改服务器行为的部署来说,是非常有用的。")]),s._v(" "),e("li",[s._v("--enable-deflate 是在使用 configure 脚本配置软件源代码编译选项时使用的参数。它用于启用对 DEFLATE 压缩算法的支持,通常用于 Web 服务器,如 Apache HTTP Server。这将在编译的服务器中启用 DEFLATE 压缩,这可以减少网络上传输的数据量,从而加快页面加载速度。")]),s._v(" "),e("li",[s._v("--enable-expires 是一个常见于许多软件的配置选项,特别是在编译 Nginx 或 Apache 服务器软件时。它的目的是启用对 HTTP 响应中 Expires 和 Cache-Control 头的自动处理。这些头可以指示浏览器如何缓存页面的内容。启用 --enable-expires 选项通常会让服务器软件能够根据文件的变化频率来设置合适的缓存时间,从而优化性能。")]),s._v(" "),e("li",[s._v("--enable-rewrite 是 Apache HTTP 服务器的配置参数,用于在编译时启用 URL 重写功能。URL 重写允许配置特定的规则,以便根据请求转换 URL,这可以用于实现诸如用户友好的 URL、内容的永久链接(PR)管理、目录结构变化的透明度或者其他 URL 处理需求。启用 URL 重写功能后,Apthon 将包含 mod_rewrite 模块,这个模块在运行时处理 .htaccess 文件中定义的重写规则。")])]),s._v(" "),e("p",[s._v("安装Apache")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("h2",{attrs:{id:"apache-安装后检查"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#apache-安装后检查"}},[s._v("#")]),s._v(" Apache 安装后检查")]),s._v(" "),e("p",[s._v("查看服务端口号,如果端口列表出现80,说明Apache服务启动正常")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("netstat")]),s._v(" -altp\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("访问Apache服务器,如果出现以下Apache测试页,说明Apache服务已经正常启动。")]),s._v(" "),e("h2",{attrs:{id:"apache-httpd-conf-配置文件"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#apache-httpd-conf-配置文件"}},[s._v("#")]),s._v(" Apache httpd.conf 配置文件")]),s._v(" "),e("p",[s._v("Apache的httpd.conf是Apache HTTP服务器的主要配置文件,它控制了服务器的行为。以下是一些常见的配置指令示例:")]),s._v(" "),e("ol",[e("li",[e("p",[s._v("设置监听端口:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("Listen "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("80")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("设置文档根目录:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("DocumentRoot "),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/var/www/html"')]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("设置默认索引文件:")]),s._v(" "),e("div",{staticClass:"language-she line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("DirectoryIndex index.html index.php\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("设置服务器名:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("ServerName www.example.com\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("设置虚拟主机:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("VirtualHost *:8"),e("span",{pre:!0,attrs:{class:"token operator"}},[e("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("0")]),s._v(">")]),s._v("\n ServerName www.example.com\n DocumentRoot "),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/var/www/example"')]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/VirtualHost"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("设置日志文件位置:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("CustomLog "),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/var/log/apache2/access_log"')]),s._v(" common\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("设置错误文档:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("ErrorDocument "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("404")]),s._v(" /errors/notfound.html\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("设置目录权限:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("Directory "),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/var/www/html"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n Options Indexes FollowSymLinks\n AllowOverride None\n Order allow,deny\n Allow from all\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/Directory"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br")])])]),s._v(" "),e("li",[e("p",[s._v("设置CGI目录:")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("ScriptAlias "),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/cgi-bin/"')]),s._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"/var/www/cgi-bin/"')]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])])]),s._v(" "),e("h2",{attrs:{id:"虚拟主机"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#虚拟主机"}},[s._v("#")]),s._v(" 虚拟主机")]),s._v(" "),e("p",[s._v("虚拟主机主要应用于HTTP(Hypertext Transfer Protocol,超文本传输协议)服务,通常又称为网站空间。它把一台运行的物理服务器划分成若干个“虚拟”服务单元,对用户表现为多个独立服务器。")]),s._v(" "),e("p",[s._v("Apache服务实现虚拟主机主要有三种方式:")]),s._v(" "),e("ul",[e("li",[s._v("基于端口的方式")]),s._v(" "),e("li",[s._v("基于域名的方式")]),s._v(" "),e("li",[s._v("基于IP地址的方式")])]),s._v(" "),e("h3",{attrs:{id:"基于端口的虚拟主机实现方式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#基于端口的虚拟主机实现方式"}},[s._v("#")]),s._v(" 基于端口的虚拟主机实现方式")]),s._v(" "),e("p",[s._v("修改配置文件")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /etc/httpd/conf/httpd.conf\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("监听默认端口80以及端口8080")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("Listen 80\nListen 8080\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("p",[s._v("主机配置部分可以包含多个虚拟主机的配置,每个虚拟主机都是一个独立的网站。")]),s._v(" "),e("p",[s._v("需要修改端口号以及该端口号访问的网站主页存放目录DocumentRoot。")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("VirtualHost *:808"),e("span",{pre:!0,attrs:{class:"token operator"}},[e("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("0")]),s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ServerAdmin webmaster@dummy-host.example.com")]),s._v("\n DocumentRoot /var/www/html8080\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ServerName dummy-host.example.com")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# ErrorLog logs/dummy-host.example.com-error_log")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# CustomLog logs/dummy-host.example.com-access_log common")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/VirtualHost"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br")])]),e("p",[s._v("重启服务")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" httpd restart\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("h3",{attrs:{id:"基于域名的虚拟主机实现方式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#基于域名的虚拟主机实现方式"}},[s._v("#")]),s._v(" 基于域名的虚拟主机实现方式")]),s._v(" "),e("p",[s._v("修改配置文件")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /etc/httpd/conf/httpd.conf\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("基于域名的虚拟主机,需要开启NameVirtualHost选项,在默认配置中将这行的注释删掉即可")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[s._v("NameVirtualHost *:80\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("在配置文件中明确写出通过不同域名访问的主页存放目录DocumentRoot")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("VirtualHost *:8"),e("span",{pre:!0,attrs:{class:"token operator"}},[e("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("0")]),s._v(">")]),s._v("\n DocumentRoot /var/www/a\n ServerName www.a.com\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/VirtualHost"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("VirtualHost *:8"),e("span",{pre:!0,attrs:{class:"token operator"}},[e("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("0")]),s._v(">")]),s._v("\n DocumentRoot /var/www/b\n ServerName www.b.com\n"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("<")]),s._v("/VirtualHost"),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v(">")]),s._v("\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br")])]),e("p",[s._v("创建www.a.com和www.b.com的主页文件")]),s._v(" "),e("p",[s._v("配合DNS服务或者修改/etc/hosts的主机文件。一般来说,实现域名访问是DNS(域名解析服务器)和Web(网站服务器)协同工作的结果。如果没有配置DNS解析,也可以通过修改/etc/hosts主机名文件来实现域名和IP地址之间的映射。")]),s._v(" "),e("div",{staticClass:"language-she line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("192.168.1.100 www.a.com www.b.com\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("重启服务")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" httpd restart\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("h3",{attrs:{id:"基于ip地址的虚拟主机实现方式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#基于ip地址的虚拟主机实现方式"}},[s._v("#")]),s._v(" 基于IP地址的虚拟主机实现方式")]),s._v(" "),e("p",[s._v("在Linux中,如果要为网卡eth0多绑定一个IP地址,可以用ifconfig命令临时配置eth0:0地址,但这种方式配置的地址在重新启动网卡后失效。")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("ifconfig")]),s._v(" eth0:0 "),e("span",{pre:!0,attrs:{class:"token number"}},[s._v("192.168")]),s._v(".1.101\n"),e("span",{pre:!0,attrs:{class:"token function"}},[s._v("ifconfig")]),s._v(" eth0:0\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br")])]),e("p",[s._v("如果想永久生效,只要在/etc/sysconfig/network-scripts目录中创建一个名为ifcfg-eth0:0的文件。")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("# 待补充\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("修改配置文件")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /etc/httpd/conf/httpd.conf\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("通过VirtualHost设置网卡捆绑的两组IP地址对应的主页根目录DocumentRoot")]),s._v(" "),e("div",{staticClass:"language- line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[s._v("\n DocumentRoot /var/www/html100\n ServerName 192.168.1.100\n\n\n DocumentRoot /var/www/html101\n ServerName 192.168.1.101\n\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br"),e("span",{staticClass:"line-number"},[s._v("2")]),e("br"),e("span",{staticClass:"line-number"},[s._v("3")]),e("br"),e("span",{staticClass:"line-number"},[s._v("4")]),e("br"),e("span",{staticClass:"line-number"},[s._v("5")]),e("br"),e("span",{staticClass:"line-number"},[s._v("6")]),e("br"),e("span",{staticClass:"line-number"},[s._v("7")]),e("br"),e("span",{staticClass:"line-number"},[s._v("8")]),e("br")])]),e("p",[s._v("重启服务")]),s._v(" "),e("div",{staticClass:"language-shell line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-shell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[s._v("service")]),s._v(" httpd restart\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/88.3bb84403.js b/assets/js/88.3bb84403.js new file mode 100644 index 00000000..5d69b316 --- /dev/null +++ b/assets/js/88.3bb84403.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{749:function(s,e,t){"use strict";t.r(e);var a=t(7),n=Object(a.a)({},(function(){var s=this,e=s.$createElement,t=s._self._c||e;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h2",{attrs:{id:"pytest"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pytest"}},[s._v("#")]),s._v(" pytest")]),s._v(" "),t("p",[s._v("pytest是基于python的测试框架。")]),s._v(" "),t("p",[s._v("官网:"),t("a",{attrs:{href:"https://docs.pytest.org/en/7.4.x/",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://docs.pytest.org/en/7.4.x/"),t("OutboundLink")],1)]),s._v(" "),t("p",[s._v("特色:")]),s._v(" "),t("ol",[t("li",[s._v("按照约定自动收集用例")]),s._v(" "),t("li",[s._v("作用于测试对象的多种标记功能")]),s._v(" "),t("li",[s._v("自定义fixture")]),s._v(" "),t("li",[s._v("多种执行方式")]),s._v(" "),t("li",[s._v("可视化测试报告")]),s._v(" "),t("li",[s._v("控制台打印执行记录")])]),s._v(" "),t("p",[s._v("两个文件,conftest.py 和 pytest.ini")]),s._v(" "),t("ol",[t("li",[s._v("conftest.py文件,conftest.py中定义的fixture,不用导入测试模块,可以直接在测试模块中以str或函数方法参数使用")]),s._v(" "),t("li",[s._v("pytest.ini文件,pytest执行方案配置。常用:addopts,markers,python_function等。")])]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 安装pytest")]),s._v("\npip "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" pytest\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# -U 升级已安装的pytest")]),s._v("\npip "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" -U pytest\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 检查version")]),s._v("\npytest --version\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br")])]),t("h3",{attrs:{id:"测试发现约定"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#测试发现约定"}},[s._v("#")]),s._v(" 测试发现约定")]),s._v(" "),t("p",[t("code",[s._v("pytest")]),s._v(" 将在当前目录及其子目录中运行所有文件名为 "),t("code",[s._v("test_*.py")]),s._v(" 或 "),t("code",[s._v("*_test.py")]),s._v(" 的文件。")]),s._v(" "),t("p",[t("a",{attrs:{href:"https://www.cnblogs.com/bonus_scene/p/13629896.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://www.cnblogs.com/bonus_scene/p/13629896.html"),t("OutboundLink")],1)]),s._v(" "),t("h3",{attrs:{id:"执行测试用例"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#执行测试用例"}},[s._v("#")]),s._v(" 执行测试用例")]),s._v(" "),t("p",[s._v("运行全部测试用例:")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("pytest\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("运行指定测试用例:")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("pytest -k 关键字\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[t("code",[s._v("pytest")]),s._v(" 默认不输出任何打印信息,如果要看打印信息,需要在运行时添加-s的指令。")]),s._v(" "),t("h2",{attrs:{id:"web自动化测试"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#web自动化测试"}},[s._v("#")]),s._v(" Web自动化测试")]),s._v(" "),t("h3",{attrs:{id:"安装selenium"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装selenium"}},[s._v("#")]),s._v(" 安装selenium")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("pip "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" selenium\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("h3",{attrs:{id:"安装webdriver-helper"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装webdriver-helper"}},[s._v("#")]),s._v(" 安装webdriver-helper")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# pip install webdriver-helper")]),s._v("\npip "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("webdriver_helper")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1.0")]),s._v(".5 "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 解决 ImportError: cannot import name 'get_webdriver' from 'webdriver_helper' (unknown location)")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("webdriver-helper 是一个 python 第三方库,用来更加便捷的使用 selenium,完成浏览器自动化控制的辅助工具。")]),s._v(" "),t("p",[s._v("因为 chrome 频繁自动更新,浏览器驱动随时可能失效,导致代码跑不起来。")]),s._v(" "),t("p",[s._v("有了 webdriver-helper 就再也不用关心浏览器和浏览器驱动的匹配问题了。")]),s._v(" "),t("p",[s._v("目前有两个版本:")]),s._v(" "),t("p",[s._v("第一个是免费版,版本代号 1.*, 这个版本可以帮助你免去寻找、匹配、下载合适的浏览器驱动。")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("pip "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" webdriver-helper"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("==")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("1")]),s._v(".*\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("第二个是付费版本,版本代号 2.*,是在免费版的基础上进行了改进和增强。")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/9.e68ed53e.js b/assets/js/9.e68ed53e.js new file mode 100644 index 00000000..6541eec9 --- /dev/null +++ b/assets/js/9.e68ed53e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{634:function(s,e,a){s.exports=a.p+"assets/img/20210322183954.86f048d2.png"},635:function(s,e,a){s.exports=a.p+"assets/img/20210322183450.bab03cc2.png"},636:function(s,e,a){s.exports=a.p+"assets/img/20210322184100.88bcd1b9.png"},637:function(s,e){s.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZwAAABUCAYAAAC2jYFUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABO7SURBVHhe7Z0LcBRVvsY7ycxkJiGQTKBCQsgDEvIOD++CBFBQyi0pBORlqaCIgLxFubJk4QKyvBNgAS9QWFctF1heEVhc4BoeCmjkDbdYEAFrQcQVkYcC8hC+e/5nJi4yLZJJT/d0z/9X9VXSM5NMz+l/f9+c7tN9FDAMwzCMDnDgMAzDMLrAgcMwDMPoAgcOwzAMowscOAzDMIwucOAwDMMwusCBwzAMw+gCBw7DMAyjCxw4DMMwjC5w4DAMwzC6wIHDMAzD6AIHDsMwDKMLHDgMwzCMLnDgMAzDMLrAgcMwDMPoAgcOwzAMowscOAzDMIwucOAwDMMwusCBwzAMw+iC6QLnp59+wldffYV9+/Zh8+bNKC8vR1lZGVasWIF169bJ5e3bt+PQoUM4f/68968Yf6A2ZbGqopMnT3qrh6kK5FXkWdu2bZMeRl5G7UneRsvkdeR55H3kgWYlaAPn2rVr2LFjB+bPn49BgwahZVERatepg/DwcCiKct9yOBxISUtDhw4dMHr0aCxZsgSfffaZ912Ye6HWnizWvUT7F/PrHDlyBIsXL5ZeRJ5UPyVVepRaW/6ayANr166DoqJW0hvJIz/++GNcv37d+y7BS9AEzu3bt7Fr1y5MmDABrdu0+Xkj2KOjYX/4IShDhkCZMwfKqpVQRBApx45BOXcOyoULUG7ckB9EuXzZs3zmDJR//APKpk1Q/vIulClTENarFyILChARESH/b3zt2ujRowcWLFggvzUwvlA7/VVI/BJw7RCi9yu+47FAit9Pe9H7ceD8ktOnT0uPIa9xu+NlG4WHR8DVqBA1OvRG7cFTkDTxXaQt2ISsVYeRu/EM8rdeQMGOy2i8FyjceUMu520+h+w1x9Dgf3YgedoKJPznHMT0GAJX0zawO6Pl/yXPbNPmIemh5KXkqcGGqBRjqaiowLBhw5BQt65stMgGDaAMHAhl+TIoIghoBTWV6I4qBw9CmTsXEV27wu5yISwsDM0eeAAlJSUcPndA24MDRxtx4IQO5CHTpk2TnkLeYndGIfqRbkh4bS4yl/8fCnf/JMNES+Vu+Ar1Ji9FTNeBcCaly21RNzERw4cPx6effupdM+MRlaI/P/zwg+wG5ublyYZxFBZCmToViuhu0grpKuodiZ5QmAg5e0yM7AF16dJFHjcNdWjbcOBoIw4ca0O9iQ8++ACdO3eWHmKPjkFMt8Gy51K466ZqSARSWWVHED94MpwZBXK75OXly57W5cuXvWtsDKJS9OP777/HlClTUKtWLUTY7Qh78UUoe/b4hoBRunZN9qzsbdrIjdS4SRN58i4Yu6Z6QG3AgaONOHCsCXnD2rVrUVjYWH5+V7OHkDx1OQo/va4aBEao4eLdqNGpLyJsNsTGxsreF33pNwJRKYHn1q1bMl0paGyRkVDGjoVy/ryv4QeT9u1DhPi2QkVEXWM6Jhpq0GfnwNFGHDjWY+fOnWjcuIn83K62XZCx7ICq4QeL8rZ8h7i+Y2CzO2TwLFy4UHqznohKCSx7RA+mSdOmntFlo0YFf9Dcrf37YRM9HjoWO2DAAFy4cEE8GhrQjsSBo404cKwDeQB5AXmCs1k7ZC47qGrwwSoKnthnR3rOXTdrJodb64WolMBAXc0ZM2bI45m21q09o8bE46aU+CzKksWwi28F9ZKT8cknn4hHrQ8ZCAeONuLAsQY0/DgpqR7s0cILJi1RNXSzKHPlIUQ2biU9urS0VJdTB6JStIe+AbRv397TqxEfRBq2eNz0OncOER07ys81c+ZM8Yi1IQPhwNFGHDjmh75A077veqiT7CWombjptOc26gwvkZ/rsccew6VLl7yfNjCIStEWGneek5sLe2JicA0I0EoUnn/+s+yODh06VPdjoHpCBsKBo404cMwLXdk/ePBgacoJo+ZJk1Y1bxOr4V92wR5XF7m5eThz5oz3k2uPqBTt+PLLL5FUT3Q38/OhfP21r1lbSX9/X476eOaZZywbOmQgHDjaiAPHnFDYdO/eXezrdqTOXa9q1lYRXcsTmZ4rDxmSlwcCUSnacPbsWaSlp8NO52tEt4z+seW1cyfsTicGDhwolqwHGQgHjjbiwDEnL730EmyOSNkDUDNpqyn/o4tw5jZHo6ws6elaIyql+ty4cQP/0bw57Dk5UC5e9DVmK2vLFtnVnjVrlliyFmQgHDjaiAPHfNCdR+iEevrCLarmbFXJ0EnLwe9+10LzG4WKSqk+xcXFcLjdgbkVjRn016WyMPfuFVvLQpCBcOBoIw4cc0HX3dE+nVLynqopW105G07DUSMWY8eO9baINohKqR40TJA2jLJ5s68Rh5Ai+vdHWoMG8i7XVoEMhANHG3HgmAfah1PT0hHbY5CqGYeK0uaXy6M3dL9LrRCV4j80brugSROEv/qqjwGHnK5cQWT9+nI8u1UgA+HA0UYcOOZh+vTpcCWmouDjK6pGHEqKfWoYmjR9QLNrdESl+M/SpUvhiI6GcvGCrwEHWt4C/4XosF63blD27lX/m0Br5QrUiImxzMRv1KYcONqIA8ccnDt3DtHC05JLylQNOODac1u+t7P1E1Ci42SbKuERCE/JlneCbvjOp+p/FyDlbT0Ph9MlJ4PTAlEp/kOHkJSJE32NVw95C/xXtW2b+t8FUuJbQGTDhnj99dfFkvmhduTA0UYcOOZg3LhxcKXlGHKtTf727+Fo8Zhsx3tJ7W8DKXe/8chslOVtoeohKsU/aDZOuvhROXXK13j1UOUGqFymeW4OHYLSvr3ncRqefefr9VJpKRLr1Quqa3PoW9vVq1e9S/cPtSMHjjbiwNEPf+ud9tmEhETUGTlb1XgDLdmroXZ0OFHnlZnIXntc3nWaDu3RdAOJY9+ELbeF6t8GUjnv/1N6vRbnckSl+AeNT5czcYrfDZG3wH0e/+Ybz+M0kOHu5/SQ9/23bt0qloIDMgFap969e2Pjxo33PdSR/oYDRxtx4OiHv/W+ZcsWaax55WdVjTeQSpu3Ua6zYnMg673PVF9jpKKatpHTWVcXUSn+0SAjw7jDaSRvgfs8fvas53GjAkco2A6rVe6Adrtd/oyLi8OQIUNkL/VeJwPptRw42ogDRz/8rXc6nOZMzVI13EArqv1Tcl1rD5mq+rzRcvcfj4zMRt6W8h9RKVXnu+++8xxOKy/3MVvd5C3wn5fpkNrhw1B+/3vP40YdUhOiieUeeeQR8VtwULkD3ima/5x+JiUlYfTo0Th48KD31f+GnufA0UYcOPrhb723bdsONTr3UzXcQCvMnSjXLxh7N6S0//5Aen51p2cRlVJ1aI4buSFPnPAxW93kLaRflRGDBio1eTJS0tLEb8GB2g54pyq/CWZmZmLSpEk4IbYrQY9x4GgjDhz98Lfek+unGNbDUMLC5ToVVPyo+rzRyl5zTK5fdS9uF5VSdWjubrnxjBgOXSl6/7slus5K167G36X6zTfhcnmGEgaDhg8frt5eKqrcGQsKPHOhzxcSvwRcHADayqjAoVpTq0E95W+9Uy+ozoiZqoYbaAV74ORvFV4v1o+8vzqISqk6q1ev9mywmzd9zVYv0fuT1J4zWkuXeA45Vq6jiZUldERILARUHADayqjAMbvCk7PkiDA10w2kgv2QWuEu4fVi/dasWSMczn9EpVQdGoElNxCdoBfLhshbIKrPGa25cxHndovfgoPfOsRQqcpve02aNJETzNHvfEhNG4VK4JjhkFql7q73WrVqeea7UTHcQOvnQQNDp6k+b7Ryy7UZfSsqpeocoutdaKMZOW00vT9J7TmjNW4cMrO0uVBKC+61A1aeTE1PT8eECRNw9OhR71+JzyEe58DRRhw4+uFvvdMoLPeACaqGG2j9PCza7kTWms9VX2OkaDpqWr/Dhw97W8s/RKVUnevXr3u+HSxf5mu2eslbQKrPGayIzp3lxGzBwt07YOU3u4SEBIwcORL79u3zvvKX0Gs4cLQRB45++FvvPXv2RHTbJ1UNVw/9+8LPKHnxafa6L1C48wYKPrkqD7UZdeEnqd6kJYiMjMTNmze9reUfolL848GiIihDh/qYrW6qLCi15wyWPSYGb7zxhvgtOLhzB6xZs6a8aPfDDz/8zbsh0Os5cLQRB45++Fvv8+bNg6NGTVXD1UPBemsbUkyPIWjZssjbUv4jKsU/Jk+ejMi0NM8c/2JZd1VuALXnjNSePXLAwPHjx8VScEAn+qjHtW7dOjlZ3v1C7cuBo404cPTD33r//PPP5b6bsXSfqunqIrp554wyOFp39L15Z7dBut+8U0qskzMhBdOmTfO2lP+ISvEPmvOa5kpQtm/3Nd0QVvjgwShq3Vr8Zn6o2DlwtBEHjjlo8WBL1Ow5VN14Q1Tpiz6UXn/mzBlvK/mPqBT/6dCxI+zimwT9E5bQxYuwO51Yvny5WDI/ZCAcONqIA8cc0Po7XFHI33ZJ1XxDUTHte6Jzly7eFqoeolL8h0arydk+DxzwNd8QVPgf/4i8wkLNJisyGjIQDhxtxIFjDug8T3ZOLuL7/Zeq+YaaMpbslR5f3dFplYhKqR4v9O0LR4sWnnuZieWQldggtGE2bdoklqwBGQgHjjbiwDEP5eXlsNlsQXsRpl6iiz2j8prjxRf7eVum+ohKqR5nz56FOz4eYRMm+JpwqOjHHxGZm4ueTz0llqwDGQgHjjbiwDEX3bv3gKthHgorrqmacSjI3Xcs4uNr49tvv/W2SvURlVJ9aM4JOYBg3d98zdjqun0b4b16oV5yMi5duiQesQ5kIBw42ogDx1zQXZETk+ohpmMfQ2b/NFr1Z/9NHrGh3p6WiErRhjFjxsBGF1hVVPiasoUVVlwsL4javXu3WLIWZCAcONqIA8d87Ny5U+7b7j7FqqZsVdGoNJvNjvHjx3tbQjtEpWgDnSjv168fbGIDGTo1gF6i649E2NCx3g0bNohHrAcZCAeONuLAMSdr166V3/Td/caFRE9Hho0jUl4sGwhEpWgHTeVKF1zJkWtlZb4mbRXduIHwPn3kLTNWrlwpHrEmZCAcONqIA8e80JQH9MUyplNfeSJdzaitoORpK+SpkV69et33tNxVRVSKtlBPZ9SoUZ7b84segKFTGARCp07B1rIlatSoIedAtzJkIBw42ogDx9xs3rwZUVFRiCxshZz1p1QN26yi+7XFPT9abr9i4dmBvKxDVEpgePvtt+F0OmFr3hzKF1/4GrcZ9V4ZbKLosrKzNRuXHsxQAXLgaCMOHPND1x1mZWXD5oxCSsl7quZtNmWvPQ5nbnM5YeQ777zj/aSBQ1RK4Dhy5Ajy8vMRIbqjysSJcvgwvaHpJAIzomNHuUP1798fV69eFY9aH/q8HDjaiAPHGly5ckV6AH1WV+snkPP+P1WNPNhFd6COH/A6IiJsyM8vkF6tB6JSAgvdPG/GjBkyQe2pqVCWLDbPRaLffgvlD3+QgZnZqJHlD6HdDe1UHDjaiAPHWtAhtoyMTGnYcX2Kkbf5nKqxB5voHFTSxHfhqJsqPbmkpKTaUw5UBVEp+nDq1Cn07t1bnpSyN2wIRXTflGvXfE0+GHT6tAwam8OBuLg4zJo1q0p3nbUKZCAcONqIA8d60LxgNFNobGys+FJql+dBcjd8pWr0Rqug4kckjX9bBE2a9ODnnnsOp4XP6Y2oFH05duyY/LA06sMeHQ1l5EgoojtHK2KoqNe1fj0iOnWSAx7i4+NRWloqu9ChChkIB4424sCxLpcvX5ZHcdxut/QOV9suSJ23AYW7f1I1fz2VVXYEsc+8CrszSo6qff7553HixAnvmuuPqBRj+OabbzB16lTUT0mRherIzoYyfrznRqC3bvkGQiAkwkRZ/3eEvfCCDD8qlnbt2mHVqlUh2aO5G9ouHDjaiAPH+pBn0GUSDz/8sPQSuysaMZ37yfAp+PiKaiBort23kLHsANz9x8OZKjxVbJOUlFRMnz5deq7RiEoxFhqCV1FRgddeew3J9evLBrJHRcmehiK6q8qmTVD+9S/fsKiqqAdz9Kjn+qDiYnnDUepakopatcKcOXNw8uRJ8UqmEtoWHDjaiAMntCAvmT17Nh58sKUMH/IZV0ELeb4nuaQMWauPatIDyv3fr5G2YBPqjCiF66FOsidD24G8lDyVvDWY7l4vKiW4oNESCxcuxNNPP42EunVl45GoB+Jo3hzhTz4JZdgwKJMnQ5k7F8qiRZ6BCKtWQnnrLc9yaamnt9S3LyIefxyROTlyg9P/oYtS8woKMGLECKxevVrTG9NZDWqvzkKrdNCfhPj9tJPe70ei9+PA8YU8pkx80X355ZeRm5fvuTBetBX9dKXnwFX0OGo80Vf2Sig4EscsQuL4t5A8fSXq/WmxXE54bS7iB01CzZ7DENXuSbjymotwiZb/h1Q3MQnPPvssFgn/02vEmT8EXeDczfnz5/HRRx9hwYIFMiQoiFq0bInU9HTEud3yAkw6H0SNTqMuaJmCKjMrC+3bt5fHLMeOHSt3hAMHDsgTfcz9UVnMLNb9igPntyEP2r9/v2wr8ibyqEcffRSZjbKQkFBXehh5GbUneRstu93xSE1LlzOSkge+8sor0hO3bdsmPdIsBH3gMAzDMNaAA4dhGIbRBQ4chmEYRhc4cBiGYRhd4MBhGIZhdIEDh2EYhtEFDhyGYRhGFzhwGIZhGF3gwGEYhmF0gQOHYRiG0QUOHIZhGEYXOHAYhmEYXeDAYRiGYXSBA4dhGIbRBQ4chmEYRgeA/wc+/ygBcMcg4wAAAABJRU5ErkJggg=="},638:function(s,e){s.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV4AAAB/CAYAAACnrKo9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABrjSURBVHhe7Z0JdBRV2oY7CEmnu9NJp0P2PQECIWETXNCgbIMKA2hkk4AihHFDZpDFQQSBOSIyCogwjMMEZRlB9BAFBAYEfpWwOT8ogmcQ5qAsAgoo+2Le/36XYv6Qvo10urpSHb/nnPfQVHVX163b/eTW7ap7LWAYhmEMhcXLMAxjMCxehmEYg2HxMgzDGAyLl2EYxmBYvAzDMAbD4mUYhjEYFi/DMIzBsHgZhmEMhsXLMAxjMCxehmEYg2HxMgzDGAyLl2EYxmBYvAzDMAbD4mUYhjEYFi/DMIzBsHgZhjEtJ0+exKpVqzB16lQMeHQgCtp2QEZ2fdjtDlgsFmUcjghk1muANu06YlDxYMyePRubNm3C6dOnta1WPyxehmFMw4ULF7BixQoMGTIEOY3zUatWLYS76sLZqi0iew5B3DPTkPrye8h6azNyPtinTNbcTUh++V353MgeTyKi5d0Ij4yR28pt0hRDhw7FypUrcfHiRe1djYfFyzBMtfLzzz9j9erV6NGrF2w2uxBtLFxCmMmTFqPRqsNo8hl0SaMPDyLpxbcRVfg4rM4Y2Wru1acP1q5di/Lycm1vjIHFyzBMtXD+/HlMnz4dCUnJCLXa4Or1tGzJNtlWrhSnrtn6MzJLNiKq55PivcORnJqGWbNmyRa3EbB4GYYxlEuXLsk+26hoN6zpOUicMA95ZefUgjQgeZ+eQeLYElhT6sFdNxYzZ86UrfBAwuJlGMYw1q9fj/o5ObAlZyHlz0uNad3eaEQrOHnyuwhPSEPD3Mb4+OOPtb3WHxYvwzABh07hf//736NOnVDUfXwi8jddUMvPBKHWd8zgF+S+jhgxMiA/wrF4GYYJKAcOHECjxnmwZzdGztI9StmZMQ3e+wq2jBzkN22Gw4cPa6XRBxYvwzAB4/PPP0fduDhEdhuE/LLzSsGZOXkbz8J5bz/EJSRi165dWqn8h8XLMExAIFFFRDhRd+DzSqkFTbaVI7rfSLhc0dizZ49WOv9g8TIMozvUvUAt3ZhBY9UyC8K4+41AfGKSLt0OLF6GYXSFLhdrecutiLqvSCmwoI1o+To79EDrOwv8vtyMxcswjK6MGfM8wpMykffxKbXA/ExWSRmsbbrBYnNeGZ/BFgXrXd2RPmuN8vl6pvH//AhrfComTpyolbZqsHgZhtGNb775BnXq1LlyB5pCXP4mYfRfUSs+A8kvvYPcdceRv/kisudvE+K9X0pY9Rq9kznnE4SFheHQoUNaqX2HxcswjG4U9e8P5296KoXlb+q9sxMh7kTkrv1euT7miReVywORiLu7oXjw77RS+w6Ll2EYXThx4oRs7ZIgVbLyN46uAxE/8nXlOqOTNW+LbPWeOnVKK71vsHgZhtGFuXPnwp7ZUCkqPRISm4qc0q+V66oj9uQsLFy4UCu9b7B4GYbRBRrW0fXIaKWk9IglpJapbsJwFQ1HUb/+Wul9g8XLMIwuJCanIG3qMqWk9IjZxEsDsqdlZmul9w0WL8MwukD9uw2W7FJKSo/40tVwdRog1Tq9kv32dlitVq30vsHiZRjGb86ePStF12j1d0pJ6RH549qomcp1qgRavA1XfIuQkJAqjV7G4mUYxm/objWSEMlIJSk9Um/xFwhxJyH3ox+U6ytfThZo8dL8bjSPW1XuYmPxMgyjC+HhNmT/43+VktIr8aNno1ZilhywvPG6E9e9gSLQ4qVLyiKcTq30vsHiZRhGF3LzmyJx/FtKSekZmivNWtAVFmuElOvVW4YzZq295nmBFm/CmL+h2c2ttNL7BouXYRhdoGnTI7sXKyVldKSQtajW65HI+x7GyJEjtdL7BouXYRiv/Oc//8Hy5cvlgObff/+9tlTNqlWrEGZzmHpaH71CA6TT7MTr1q3TSu8bLF6GYbyyefNm2Wq86aab5L90yVhCQgKaN2+OwsJCDB8+XM4YvGTJEjk5pDumLpJeXKSUVU1K0sQFSEpJRXl5uXakfIPFyzCMV+hSqdDQ0GtO3Sumdu3asNvtcDgc8jEto6sbUqZ+oBRWTQj9oGdPysTrr7+uHSXfYfEyDHNdbrnlFg/hVg7JlgTduXNnxMUnIMGH622DLbHDpiIlLd2v2YdZvAzDeOXkyZPo37+/HIlLJVwKrUtNTcX69evla6ivl6ZGD9QoZdWZ7IX/kt0tH330kSxrVTGNeOkC7K+++gqLFi3Cs88+iwd69kSLW29FYkoK7OI0hmITpzSUq/+ndc3FX2N6Lr2GXkvbuHz5srbVXxdjxoxBcXExpwaG6tYI6Me0efPm4bHHHkNeXp7s201LS5O3xlYWLq0jCdG+0Z1rFRk+YgRsKdlysHKVwIIxuWuOwZaQpktdVJt4qVO6rKwML7zwAlrfdZes2DriVMXepAlq9+0Ly7hxsPztb7B8+CEsn32mDq2bM0c+l15Dr6Vt0LZom+PHj5fvUdUO8GAj3eXCg+ILMSoA6SdCX7ahFZbpmdtE3JWW6RnaNr2Hap2/oWNCx4aOkWq9v6E6pbrVm3PnzuGf//wnxo4di/bt28PpdCIqKkp2F0yaNEn+WHb69Gn8+OOP8g6titKl71gT8X3bsWOHtrVrocbPfZ27wJF7a8CmADIyjTechKNBMzxQWOj3fGuE4eKl6ZGHPP00YmJj5V/M0E6dYHn1VVg+/xwWIUjaIb9C2xAfBtombZveIyYuDk8PHYqvv/5aPKPmkpaUhJXiSyG+Gbpnqwh94U5UWKZnxou0rLRMz9C26T1U6/wNHRM6NnSMKq/TI1SnVLf+cvToUSxevBhDhgxBixYt5I9h6enpKCoqwuzZs7Fz506vZ4vZ2dliVyyyH5ek+5e//OUXBURiv/2OAtgaNJWtRZXQgiGNVh2GLasR7mrbDhcuXNBK5x+iZo1hxYoVuL2gQFZ2nQcfhOUfC2ERf0lpBwIaeo+FC+R70nvTPnwoWso1ERav9/zaxEtneSRSEiqJNTMzU7ZaSbgkXhLwwYMHtWf/MoMGDRK7YkHr1q1l4+lGOX/+PLo/UIjw+DRkL/hMKTYzh+aOs8YkolefPrpJlxA1G1hIuHlNmyI0PBwh4tTfcuSIpxyNynffyX2gfclv1qzGCZjF6z01XbwkOOoaoC4C6iqIFWeUNptNdiFQVwJ1KVR1mhqCvsdvvvlmlbrt6DWjR4+WDZ+4Z15F/tbLSsmZKflbLiHu6SmyD5u6Q/XurhQ1GxgOHDiAzl27XhEu9deePOkpwurKyRMIER9G2rcu3brJfa0JsHi9p6aJl+4iq9htQIKgKwsqdhvQD9ZmguQfGxcPW3ZjOcCMSnhmCI0FYctsiPiExCrfmfZLiJrVnzlz5sh+oNB+/WA5dsxTfGbJ0aNyH2lfaZ+DHRav9wS7eJPi4+XdYTQeQqtWrWTrMSMjA3379sWsWbPwxRdf6PKjT6ChH+v+8Ic/yP2P7NTbVJec1Xt7B5wdCuW+jRo1CmfOnNH2Wn9EzeoHne7QvEt1xCmO5YP3PUVn1rxfijqi9Uv7rmc/jtGweL0n2MVL3QZX+2fpsklf+mfNyL59+zDg0YFSchF3dkbatOXV0gVBXQopr5TCcWsnedYwePDvsH//fm0vA4eoWX346aef0LqgAGG5ubB8842n3MwecbDDGjbEHW3a+NUXVp2weL0n2MVbuauhpkCSGzZsGCKjomCNioW76BlklZShybZypSh1ydafkTnnE7h6D4XV6YYr2o0RI0YY2uUoatZ/SFT0Y1Xo7bfL/lPaaFDmxAmE3XYbmjRvLk+Jgg0Wr/eweM0NnWmWlpbKqwfsdgesDidc7QoRN3y6FHHj9SfUEr2B0IDp1G8bN2wqItveD6vdCYcjAg8VFWHZsmV+3fpbVUTN+gcdsDvvvhuhd9wBy7lznjILtpw9K/+AtGnXrloqxB9YvN7D4g0e6Hu3ceNGTJ48GXe1ay+7Wej4hkVEIiLvNkR17AVX32cQ89RLUswJo/8qQ49pmeuhYeI5PeVzwxyR8rU0kE/bDh0xZcoUeVNVdf/wKGrWP5586ilY69eXrUXaWI3I8eOwZmfjqSFDxP+CBxav97B4gxvq0167di1KSkrk5V10G3XXbt3RTsi09Z1tZOgxLRs8eLC8a3Xu3LlyTIXDhw9rWzEPomarDg2GUbtOHVh27/aUV7Bn1y5ZNipjsMDi9R4WL2MmRM1WDTodSE5LQ8iMGZ7S0iviA3dNateGpWVLWOa9pX6+zgl57TVZxmDpcmDxeg+LlzETomarxsyZM2HNyIDl0iUPYekW8YG75v90E0bpUlgSEmAJpPCvRpTNmp4ur5MMBli83sPiZcyEqNmqkUrSDXTLU3zglMs3bYIlOVm9Tu+89aYsazDA4vUeFi9jJkTN+g794liHBkY+c8ZTVHpGfOCUyy9c8L5O74gyUlnpl1CjOXbsGLZv367975dh8XoPi5cxE6JmfYdupwvt08dTUnpHfOCUy2kCPqNavCJUViqz0Wzbtk0eA7o1dOLEiXKQ6uvB4vUeFi9jJkTN+g7NDGF54w0PQeke8YG75v80xOOyD2ARH0LLtGnXrgtkRFmpzEZD4qXbGOk40L80rB/NCjBjxgzZGq4Mi9d7WLyMmRA16zvOyMgrrU7xOKARH7hrQlNMt2gBS0mJ+vmBypYtiHA6xSNjIfGqZngNDw+XA7yThGlq7asSZvF6D4uXMROiZn2DRkCS04Ds3espKL0jPnDK5UZHnOLTLKqrV6+WQ9sZFbpy5HpTa1PkKHDiOV26dEFdtxvLxTKxQveweL2Hxcv4iqhZ36DpPOSX/vBhT0HpHXof1XKjQ4O3i32hvlYayd+oJIkvG43eJI/DdXJ1Piz6937x72kRsUDXsHi9h8XL+IqoWd+R/Y67dnkKSu+ID5xyudHZvVuW2Wi8dTVQSLIRERGy2+Hhhx+Wsw9wV4P3sHgZMyFq1ndi6QYGcSpMLw5oxAdOudzoiLJSmY1GJV6HwyH7d2l6l/fff1+egVyFxes9LF7GTIia9Z3fdu8OC82fJh4HNOIDp1xudERZqcxGQ+IlyV6VbX5+vvwxzdugHyxe72HxMmZC1KzvvPrqq7C1aeMpqBoaW0GBLLPRkHipr5cmK/z3v/+tLfUOi9d7WLyMmRA16zvfffedbIFZ9u3zkFSNy969sqxUZqO5fPmy9ujGYPF6D4uXMROiZqsGDRRe67nnPEVVw1Lrj3/EXaKswQCL13tYvIyZEDVbNbZs2XJlLN4DBzxkVWMiykaXc1FZgwEWr/eweBkzIWq26nS85x6E9u7tKawaEipbh06dxKPggMXrPSxexkyImq06NCunIyIClvnzPKQV7AmZ95a8TdjImUf9hcXrPSxexkyImvUPupa0Dl1runGjh7yCNp98IstEM5AGEyxe72HxBid06SRNv0WXUQ54dCAK2nZAWmY92Gx2cWiuHPfKsTscSM+qL587cNAgTJ8+Xd7uf+TIEW2r1Y+oWf957bXXEGoXB2LHDk+JBVu2b5dloXESgg0Wr/eweIMDmrV8xYoVeOKJJ5CRlS2Kb4EtJh6ugi5wD3gOcc9MQ+rL7yHrrc3I+WAfGq06LKdvp9BjWpY1dxOSX35XPjd6wGi47rgPtuhYOd5KVr0GGDJkCFauXFmtU3qJmtWHMWPGINRqhWXDBk+ZBUvWr5dloOtmgxEWr/eweM0LDbxFLdIevXrJlmy4KxauHk8iedJiKdMmn0GXNPrwIJJefBtRhY/D6oyB3e5Arz595OzF5eXl2t4Yg6hZ/aDTATpFDzF62EYdEvL3v8t9p9OSYIXF6z3BLt6E2Fjs3btXq+mawalTpzBp0iQkJCWLBo8Nrl5Py5Zsk23lSnHqmq0/I7NkI6J6PineOxzJqWmYMmUKzpw5o+1dYBE1qy80j707JgZW8dfLcuyYh+BMF7GPtK/uunWxbt06sSR4YfF6T7CLl24bpyFAExISUFhYKBs5W7duxaVLl7TaDx7Onz+Pl16ajAhnJKzpOUicMA95ZefUgjQgeZ+eQeLYElhT6iEyKhqvvPJKwLshRM3qD3Vi000HoeLDIq94EKcS9EamCu3TvLfkPtK+mqnjvaqweL0n2MVLdUt3Mu7cuROzZ89GUVGRHKaUrjNv0aKF7LdcvHgxjh49qn0azMmaNWuQkpYOa2p9pPx5qTGt2xuNaAUnT34X1vg02b8cyIaYqNnAsWjRIsTExcHaoAEs770LS3m5pwCNDu3Du+Lgin2qK/aN9rGmwOL1npogXhUHDx6UwiXxtm7dWg5fSuN7kJhJ0CRqPfovqZXqDzSK3qBBxagTGobYYVORv/miWn4mCLW+3cXj5B+1xx573O+yqxA1G1hop6dNmwaX243wevWuzJV2/LinEAMdek9xehaenQ1XTIzsyw3EAa1OWLzeU1PFWxnqN6WxmanvlIYOjYyMhNPpRPv27eWPxjSzScWhRG8U+g537NgR+/fv15bcONQ3Xb9BDmzZjZGzdI9SdmZMg/e+Qnh6Dhrl5lWp3NdD1Kwx0GUi8+fPR16zZnLQGWvXrrAsmA/LyROektQrtO3582Dt0uXKsIrNm2PBggVyX2oiLF7v+bWItzKVuyfS0tJkq7hi94Rq4tTK0NRSdDlWWFiY7AO90QGctm/fjihXNJzdByK/7LxScGZO3sazcN7bDzGxsfI46oWoWeOhAowbNw7ZOTlyJgVHy5YIGTMGlkVvX5nZ4tIlT4n+Uug19FqxjZDnnpPbpG3Te9B7ffnll+JZNRsWr/f8WsWromL3BAmYvie/1D0RFRUlduVKOWnWk2xx5lhWVqatVbNLfB8djgjEFI9VSi1osq0c7n4jEBnlwp49e7TS+Yeo2epl9+7deOONN9D7oYeQKSRJLVOKTVSsvUMHhD7yCCyjRilD6+zi9Ieee/V1tA3aFm2Ttv1rIjU+HqG1ayM8NFT3WEUrib6gqnV6hPa7tqg/1To9QtsO1LGh0LGhY6Ra529ov6luA8WhQ4fwzjvvYOjQoWgpGizUt0k/3PXt2xezZs2SNzRQ+a6Kl0L/p9lRHhHfwR9//FHb0v9Dp+buurFwD3xeLbMgTHT/kYhLSNRlGIFqF29lqBuATk9KS0vlHXGjhGCLi4sx4NFH0V9UMoUe0zJaR3219Fx6TU3tQrhRqKVCg6dzal70PM39JU6fPi0vCx0/fjw6deokW7t2ujO1gnivhlq/0dHRWLJkifZqyEux8ps2Q2TXgUqBBW1EyzfiniLc3OoWn8fKrozpxMswjLkYMGCAR4u3cqjvt4M4Q/3222/lXazhqfVl/6hSYH4mq6QM1jbdYLE5r7y/LQrWu7ojfdYa5fP1TN7HpxCemIEJEyZoR6dqsHgZhrku1P9bWbSqkJypZUxdfjRegkpc/iZh9F9RKz4DyS+9g9x1x+Vladnztwnx3i/3QfUavZM55xP5h4a6aKoKi5dhGK+cOHFCXs1QUbAkVhIs5eos2CRdt9sNl8uFWpF1kTZ9hVJa/qTeOzsR4k5E7trvletjnnhRuTwQibi7GwYVD9aOku+weBmG8cry5cvlrcrJyclo1aoVevTogWeffVb+trJ06VI5OwtdJUED3Rw/flxeqkaCVMnK3zi6DkT8yNeV64wOtbKp1av6YfFGYPEyDKMLdCWRIztfKSo9EhKbipzSr5XrqiP29AZ48803tdL7BouXYRhdeODBHogeGLhrdi0htUx1E0b0w8+iT9++Wul9g8XLMIwuJCanIO21D5WS0iNmE2/KK6VIy8zWSu8bLF6GYXSBbrxo8O5upaT0iC9dDf/9MdARHbB+4XqLPpf931WBxcswjN/QAOIkukarv1NKSo/IH9dGzVSuU2ZbOTLe2CBayiHq9X6m4YpvZZmrcuMWi5dhGL+hAdnpsrOGy/crJaVH6i3+AiHuJOR+9INyvepysozZ61ArvZHHcj1CrW+6jI6u6PAVFi/DMLoQHm5D9sJ/KSWlV+JHz0atxCw5YDlNcHm9GyjoWmK67rfeki+vWa5XaJqiCKdTK71vsHgZhtGF3PymSBw3VykpPUNzpVkLusJijbjSj6vdMpwxa+1/nxM34jWERMXJVnLF1+oZuouu2c2ttNL7BouXYRhdoNHNzDIwjhRyhQRiTrfIe/ph5MiRWul9g8XLMIwu0IhmYTZ7UA547mtogszQMCs+/fRTrfS+weJlGEYXaPB0upY36U8LlbKqSUkY+3ekZ2ZpJfcdFi/DMLoxY8YM2BPTTT2Zpb+hFn14TKK8RbqqsHgZhtENuqY1SbR6Y5/+s1JaNSF1n/wT0tIz5CV0VYXFyzCMrmzYsOHKKGVv71CKK5hDl65R2TZu3KiVtmqweBmG0Z2RI0chPD4NuWuOKQUWjGm06jCsMQly8lx/YfEyDKM7NCdZly6/RUTuzWj88U9KkQVTGm84CUdWHgoLH6zSnWqVYfEyDBMQzp07hzsKCmDLykWjlYeUQguGNFzxDcLTG6Btu/a6TajL4mUYJmCcP38e9z9QiLDoeGQv+EwpNjOHbgsOi3CjV+8+us5izuJlGCag0PW9L7/8spwqJ37YVORvvayUnJmSv+US4ode2eepU6fKMugJi5dhGEPYvHkzEpOSYc9ujKx5W5TCM0NoLAhbRkMkp6Ri27Zt2t7rC4uXYRjDOHv2LMaMGSNnJ3a07ozst7cr5VcdyZq/FY7bOsl9Gz9+vOyjDhQsXoZhDGffvn0Y8OhAOWtFxJ2dkTZtebV0QVCXAk3h47i1k7w+d/Dg32H//v3aXgYOFi/DMNXGoUOH8PzzYxEdEwNrVCzcRc8gq6RMzh6hEqUu2fozMud8AlfvobA63XDXjcWECRNw5MgRba8CD4uXYZhq5+LFiygtLUWvPn1gtztgdTjhaleIuOHTpYgbrz+hlugNhAZMp37buGFTEdn2fljtTjgcEXioqAjLli3z69bfqsLiZRjGVJCE6ZbcyZMno13HTrJFSmPqWh1RcOXfiujf9ER0v+GIeeolZaL6PoPoDj3kc0ng9NqY2Dh06HQvpkyZgrKysmqRbUVYvAzDmJ4ffvhBjvdbUlKCF154AcXFxejarTs6d+2Ge3/bVYYe07LBgwfLH8fmzp2LdevW4fjx49pWzAOLl2EYxmBYvAzDMAbD4mUYhjEYFi/DMIzBsHgZhmEMhsXLMAxjMCxehmEYg2HxMgzDGArwfzLxKFTeQxtNAAAAAElFTkSuQmCC"},639:function(s,e){s.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAACBCAYAAABq6MktAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABSmSURBVHhe7Z0JcBTVvsYnQobJvg1ZSCQhBEICJAhCEJEEWQLPBbgaQGXxyoVyYbGkUPRhCeJ7iGjJ4voUUMGrSHG9KqWiluKGiqiAC5aIIqLiBooLKur/ne9k4h3S3TChuyczw/er+moy3T0zfTLTvzl95vQ5HiGEEOIalCwhhLgIJUsIIS5CyRJCiItQsoQQ4iKULCGEuAglSwghLkLJEkKIi1CyhBDiIpQsIYS4CCVLCCEuQskSQoiLULKEEOIilCwhhLgIJUuIwxw8eFD27t3LxGgOHDgQeKdDg5IlxGFeeeUV8Xg8TIxm7ty5gXc6NChZQhwGkk1u1Ur2qQPSjUxSGdxomZMpULmx0TKnskkFotoStMzJzFNp12iZkzlLva+ULCHNDCSb6vOpo0sdXi5kisrpjZY5mUKV2xotcyofqECyO4OWOZlFKiWNljmZcyhZQpofStY6lCwhxDaUrHUoWUKIbShZ61CyhBDbULLWoWQJIbahZK1DyRJCbEPJWoeSJYTYhpK1DiVLCLENJWsdSpYQYhtK1jqULCHENpSsdShZQohtKFnrULKEENtQstahZAkhtqFkrUPJEkJsQ8lah5IlhNiGkrUOJUsIsQ0lax1KlhBiG0rWOpQsIcQ2lKx1KFlCiG0oWetQsoQQ21Cy1qFkCSG2oWStQ8kSQmxDyVqHkiWE2IaStQ4lSwixDSVrHUqWEGIbStY6lCwhxDaUrHUoWUKIbShZ61CyYebgwYPy/vvvy6pVq+TKK6+Us0aNkh69e0ub44+XpORkncSkJJ2G+1jXvapKb4vH4LF4jt9//z3wrMQu+/fv16K444475KKLLpLBg4dKeXlXyczMkiS8H4mJfwX3U1NTpbi4RKqrB8j48efLggUL5KmnnpI9e/YEnvHYgpK1DiXrMn/++af+AM6ZM0dOrqkRn/ogxnu9klRZKS3HjBHP7Nniuftu8TzxhHjeeMM8WLd0qd4Wj8Fj8Rx4Ljzntddeq18Dr0VC44cffpDVq1droZaUlEpcXJwkJKQpefZUOVuys6dKfv51SqR3q/UrDWnf/h5p2/ZGycmZIenpY9Vj+ikB5+rnyc7OlZEjR8udd94pu3fvDrxibEPJWoeSdYnt27fL1GnTxJ+dLS1atBDvkCHiuflm8WzdKh4lQ+yEreA5tmzRz4nnxmv4c3Jk2qWXyocffqi2II35448/5PHHH5chQ06T+Ph48XqTJSVlmJLp/6pa69PSrdsbttO160tSVHSLFm9CQjst3crK7lq4P/74Y2BPIp9PP/1UduzYIb/88ktgyeGhZK1DyToMDuI+/fpJy5YtJb6uTjwP/FM8339vlKTTwWv88379mnht7MMTqgZM6mut119/vap15qnaf6pkZIxVNdSlSoqvGyTpdEpL/y1+/yWSlNRRn3lMnDhJdu3aFdizyOXWW29Vx1e9HNLT06WsrExqa2tl8uTJMn/+fLn//vvlxRdflI8//lh+/fVXSvYwoWQdAnLt2q2beBMSJE6dvnu+/NIownBlzx69D9iXihNOOGZl+/PPP+umlJSUVHUq31EKjp8vFRWvmcowHGnffrkkJ5+qvwTHjRsf0bLdvHmzPjtqEG1DjjvuOP1lgXZp3GIZautoo8a6Leq+Wuh4KFnrxLxk0eZ2+rBh9XJF++p33xml11z5bp/EXXON3rczhg8/ZtoHAb5Y8vLylVzbS9u2NynJbTJIr7lSUvKAkm0/LambbrpJ/xgaaaBpBT/yBQvWKmh6qaqqkiR1MKoFroSStU5MS3bp0qX6QPGOGyeer782Si5S8tVXeh+xr9jnWOb777+Xs8+uE6/XpyT730pq7jcJHG2Ki+9SIjteOnUql23btgVKEDn06dNHHWNGqTYkQX155+TkyNq1a9lccJhQskcBfgwYOXq0xOOb/rFHjVKL1Dz6iMSrAwP7jna0WOPtt9+WNm0K1MFfKWVlT5iKLdJSUfGKpKePlFbqg/zggw8GShJ+8HnYsGGD3HjjjTJMnZm1bt1afylDpI3limYB1F6nT58uP/30k348JWsdSraJoD/lyf36SavOncWza5dRZJGeTz6RVmVl0re6Wv8gFCu8/PLL6hQ8WQlrjBLXRlOhRXIKjp+n22oXL14cKJG77Ny5U+69916ZNGmSlJeX69fGLe5jOXoWvPDCC1r+wYKFdLHdm2++GXimeihZ61CyTQBSwg9JXpxGfbfPKLBoyb590uqkk6Sye/eo6lZkBX7l9nq96tR1mqnAoiXt2t2paohe3RPCSdC+umnTJlm4cKHU1dVJXl6e/n+dfPLJcsUVV8ijjz4qX3zxRWDr/4AzNtRYIQjcomZ78803m7YhU7LWoWRDBKdTp/TvL96+fcVz4IBRXNGWn3/WXxbVAwbIb7/9ppZEJ1u2bNG1q9zcK0zFFW1p336FqlXGy7JlywIlbDroVfH000/LNddcIwMHDpSUlBTJyMiQ008/XQscX0qhfrlWVFToXga9evWS9957L7DUCCTrVbXh/1MHpRupVilvtMzJpKqc02iZU5mrAsnOC1rmZOpUMhstczInqvc1LJKdPGWK+Dp21LVAg7CiNXv3iq+kRKZMnaruRR/4kSsvr41kZZ1vKqxoTWHhIl1z3LhxY6Ckh+err76Shx56SKaq97FHjx761L9du3YyduxYfRHEO++8c9SXYEPUt9122xGvJoSA+/XsKaf07u1KTjrxROmtyma2zolUqbO6Pi7tf9+qKumpzoBxa7bebrDf2H+zdU6kurJSVq5cGXinQwN+aRLr1q2Tljht2rbNKKpojzo4UDaUMdqoqxslSUknKDFFbg+Co43fP0kKCtoa2s0hO0gT8oREi4uL9Q9RkCskC9l+9tlnga0JaR7glpDBqXRBYaHE3XKLUVBORVXJD4mqiXjUt5NnxX3m2zucuCVLdBmjqdng+eef1+2XZWWPm0rKbny+GsnMnGC6Dsux3mydU6moeF0SEzvpAYFweo/TfJzuo8sU+q+iGQC1TDQLxNIPmCQ2gFdCBqdKPnXq5Tl40CAnxwKxBt/HBQ2P/Fs8eXnicVPuDVFl8xUVye23367uRQfduvWQrKxJBjk5lfLyp9T7kigdOjx4yHLcx3Knxjo4XDA4DX6gwtVUQ4cOleuuu07Wr1//V7cpQiIVeCVk2kKwbtcoG0u2Ia++Kp6CAvN1Tue+e3VZo4FX1f8FtdguXV4wlZNTadNmjrRo0UHXKnEfty1alKjlcw3bupXk5B5N/tGBkOYGTgkJdM6ORz9BVXMwSMnJWEn211+t1zkdVUaUFb8ShxN0B0J/zKYM0/iPf0yUtLQzTaXkdLzeXuL3T9V/+/1T1P0qwzZuJj//f3TbLIexJNEEnBISM2fOFO+55xqF5HSsRPraa+GryaqgrChzOEFXIpQfVxjNmDFDtm7dGlhjTVZWaykqutVUSk6nrGyt2j+f/sUfzQRutQFbpWvXl3UXqki87JYQK+CTkMCMBZ677jLIyPE0liyGLVz7mHjy88WzSB3cwevcjCoryhxOGiSLQCboflRYWKjbH3FVUmMwtB5+Tce4rWZSciPog4v9y829ynS920lLq5S71HtDSLQAn4REalpafW1S/e1qApL5KxhirkcP8Sxfbr69W9m4UVJSU9Vf4SNYssHB5ZwNwp03b558/vnnensMKZmcnG8qI7fSINmcnMtN17udtLSRctlll+nyExINwCdHBJciosbk2bHDKCOnA7GYLQ93VC0RY4Nirip0DQpHHntM1diD5GoWCBe1XFwGeskll0hKSrmpjNxIfXNBohQVLVG3Pn3fbDs3g14Uo0efq94hQqID+OSIHMClszjIv/jCKCOng9cxWx7uYKBxtS+4Wgid3MMRvFaDTI8UfAHgSqiWLZN1FyszITkd/PCVnX2Z/js7+1J1v6dhG7eD+cZOO+1M9Q4REh3AJyGhB8d47z2jjJwOJGK2PNzZtk2XOZxYNRcgkCpG1kJf0ZEjR+qBTDDtSWpqqamMnE59F64y9XdwF64OavnsQ7ZzOxkZ58uECRMC/zFCIh/4JCSycTGAOqU1yMjpQCpmy8MdVVaUOZyYSRYDvqB5YMCAAXrYvX379gW2Ft0Z3+dLMZWRk6m/GCFJSktXH7K8Q4eH1PLwXIzQkPT002TWrFmB/wAhkQ98EhJnjhghHszXpf52NZEiWVVWlDmcNEhWzzChaqxoPsC8XFYz7mJ7tJWXlT1mKiSngstms7IuNl2HNlK3L6sNTmJijq7FExItwCchgbEzE6urjTKK0ST266fLHE4gTVyPP23aND3maSh07FgW9lP25gr65eJLBSNtERItwCchsWfPHn3a6vnoI4OQYi47duiyoszhBFcyoSdHU1iwYIGkpGD0LXMxxVL8/gulpubUQMkJiQ7glJDBoNbHzZpllFKM5birrpIaVdZoAEP5oQ9taekaUzHFSioqXhWfL1NfhYexcwmJFuCUkMHAyXos2d27DWKKmaiyQVqhDhIdCVx44YWSllZtKqdYSW7uDGnTJl99mZTqs4zKykrdTxg9LHbt2hX4TxASecArTWLw0KHiPecco5xiJCjboCFD1F/RA2qzuEihsHCJqaCiPeXl61T5EmX16tW6vBgzNnhc2bS0ND0EYvC4sujbTUgkAK80id2qppeckiKelSsMgor2xK24T19KizJGG5gdwOfDhQnh604VnrwuKSm9ZMSIvwVKagTTyQTPkIDLj9HHOXiGhG+++Saw9dHzySefhDR1DSZdxAy3TGwmuBtlKMAtTQZdaOK9XvFs2GAQVdTmpZd0mdauXavuRScjRpwlCQmd9GhV5sKKvqSnj5K2bYtk7969gVKGBmr3wXN9oVcCrqoLnuurqUMmjhmDKdYr9ISVhwNDZAb3dWZiK2GbEnzJkiXiTUoSj/rAGYQVbdm8WZcFMz9EM6hB9erVW5KT+yjRbjCVVjTF779I0tLS5aOPPgqU8OjZv3+/bkZomLW2flbf3ENmrcUszIcjPz9fyxptwpg+3KpJglOCW4dTgjeRq6++Wrzqw+R5/nmjuKIl69frMuDgiwVQ4+vSpasSbaW6XW8qr8jPJiXY83Q7a6j9hZsKBkjHcy9cuFDq6ur0GL5J6osWA+9AoDhbC649o2aMS5sbajOQdF5enjz55JOBLf4DJWsdSvYowIcUp9lx4R6K0IHELVum933x4sXqXuyAWlvfvqdIYmJR1HXtwjQ6qamDJCcnV0+tHS7Q1vrWW2/pM7TRo0dLQUGBvuquT58+egD1yy+/XEu4QbJIwyA9w4cPP+QCCUrWOpTsUfLss89Klt8vPvXh9Hz9tUFmERe1j9jXLFV7ee6559SS2AM1Nczu2qqVT9W4MMB25E8VXlx8l/piyJVBgwbL1+o9am7wQxfm2L/44ot1rRVd+4Il2xBcBg0Bo60XULLWoWRt8OWXX+oO/N7k5PqeB3/8YZRbcwf7tOI+vY/YV+xzrLNu3TrJyvIrCVQaBniJlHTu/Kykp/9N1woxKHkkzuHVqVMndYwZBRscyLampkYefvhhStYilKwDrFq1Svw5OeIrLRXPv9aIRx0weJFmDfZhzRq9T63VvmEfjyXQfDB58hRdE0tJGaxk+y9T2YU7Xbo8J5mZFyi5eqV//wGyffv2wB5HFg0D8TSWqlnQhIA+y63UF8af6r5a6HgoWescE5IF+JV70aJFkpGVJQkdOtTPzbV3r1F+bgevuXChJJSUSIbfr9tesW/HKpgTbMyYcQHZVkth4WIlu/A3I5SUPCBpaXVarlVVffQv+5HMM888Uz9uhzrIIND09HSdxMREvQxizczMVF8aXXRvBYz3G6/+x1uDDk4nQ8la55iRbAPoEoM2ra4nnKA/pL5hw8Rz/0rxfLfPKESngudeuUJ8Z5yhX7Oie3d96eWRuuccS+BiC7TXonuUzwdhjNLtoRiI20yKTgQ/wPn9F0tycnvdLHDuuWNc6zngNOja17lzZ6mtrZUpU6bI/Pnz9eca07eje1njzxbbZK1DyboIOn/Pnj1bSjp10qdeyT17StzVV4tn1YP1My4cPGgU5pGCx+Cx6jniZs3Sz4nnxmvgtd599121FbECcsBkjOPGjVc12xTxen1KvDWSnT1diopu0ZezmgnzSEEPgeLiZZKXN0sJfLiq8bXWteeBA2vlnnvuafKFBdEGJWsdSjZMYN58TOt8znnnSbESImqcSKI6rU8aNEi8f/+7eGbONA3WJQ0erLdteByeA8+F5+Sc/EcHOtajZobpx2tqBkhWVmv1mfIo8SYoAXdU8q2WjIxRKuMNSU8fq25rJTW1QhIS/PpxOJXu3r2XTJ8+Xfc5/fbbbwOvFPtQstahZJsJ1Kg2b94sjzzyiO6niOHsJk2aJBdMmCDjlVQR/I1lWIe2VWyLx7AZwD0gRrSX4tT4hhtu0Jeo4j04//wLZPx49b6oTJw4UXdxmjNnjixfvlzP7rtz587AMxybULLWoWQJIbahZK1DyRJCbEPJWoeSJYTYhpK1DiVLCLENJWsdSpYQYhtK1jqULCHENpSsdShZQohtKFnrULKEENtQstahZAkhtqFkrUPJEkJsQ8lah5IlhNiGkrUOJUsIsQ0lax1KlhBiG0rWOpQsIcQ2lKx1KFlCiG0oWetQsoQQ21Cy1qFkCSG2oWStQ8kSQmxDyVqHkiWE2IaStQ4lSwixDSVrHUqWEGIbStY6lCwhxDaUrHUoWUKIbShZ61CyhBDbULLWoWQJIbahZK1DyRJCbEPJWoeSJYTYhpK1DiVLCLENJWsdSpYQYhtI1tuypcxXB6UbqVKBSMzWOZEklTMbLXMqM1Qg2ZlBy5wMvnxSGy1zMl3V+0rJEtLMfPDBBzJ80CAZPmSIKxly6qlS27+/6TonMrimRv5r4EDTdXYzrLZWBvTrp2/N1tsN9hv7b7bOiYxQ+75mzZrAOx0alCwhhLgIJUsIIS5CyRJCiItQsoQQ4iKULCGEuAglSwghLkLJEkKIi1CyhBDiIpQsIYS4CCVLCCEuQskSQohriPw/dGuT0Y0Ogm4AAAAASUVORK5CYII="},640:function(s,e,a){s.exports=a.p+"assets/img/20210322213820.50457fbf.png"},641:function(s,e,a){s.exports=a.p+"assets/img/20210322215546.212c0546.png"},742:function(s,e,a){"use strict";a.r(e);var t=a(7),n=Object(t.a)({},(function(){var s=this,e=s.$createElement,t=s._self._c||e;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h2",{attrs:{id:"安装erlang和rabbitmq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#安装erlang和rabbitmq"}},[s._v("#")]),s._v(" 安装Erlang和RabbitMQ")]),s._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://www.rabbitmq.com",target:"_blank",rel:"noopener noreferrer"}},[s._v("RabbitMQ官网"),t("OutboundLink")],1)]),s._v(" "),t("li",[t("a",{attrs:{href:"https://www.rabbitmq.com/download.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("RabbitMQ下载1"),t("OutboundLink")],1)]),s._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/rabbitmq/rabbitmq-server/releases/",target:"_blank",rel:"noopener noreferrer"}},[s._v("RabbitMQ下载2"),t("OutboundLink")],1)]),s._v(" "),t("li",[t("a",{attrs:{href:"https://www.rabbitmq.com/which-erlang.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("Erlang版本要求"),t("OutboundLink")],1)]),s._v(" "),t("li",[t("a",{attrs:{href:"https://www.erlang.org/downloads",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://www.erlang.org/downloads"),t("OutboundLink")],1)]),s._v(" "),t("li",[t("a",{attrs:{href:"https://erlang.org/download/otp_versions_tree.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://erlang.org/download/otp_versions_tree.html"),t("OutboundLink")],1)]),s._v(" "),t("li",[t("a",{attrs:{href:"https://blog.csdn.net/ws_kfxd/article/details/85858736",target:"_blank",rel:"noopener noreferrer"}},[s._v("Linux中安装Erlang"),t("OutboundLink")],1)])]),s._v(" "),t("img",{attrs:{src:a(634)}}),s._v(" "),t("p",[s._v("【Erlang】准备环境")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查询是否安装某软件包:rpm -q 软件包")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel")]),s._v("\nyum -y "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" kernel-devel ncurses-devel\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("p",[s._v("【Erlang】创建目录")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("mkdir")]),s._v(" erlang\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("【Erlang】解压文件")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("tar")]),s._v(" -zxf otp_src_22.3.tar.gz -C /opt/erlang\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("【Erlang】进入解压目录")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("cd")]),s._v(" otp_src_22.3/\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("【Erlang】设定安装规则")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# –prefix 指定安装目录")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# –enable-smp-support启用对称多处理支持(Symmetric Multi-Processing对称多处理结构的简称)")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# –enable-threads启用异步线程支持")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# –enable-sctp启用流控制协议支持(Stream Control Transmission Protocol,流控制传输协议)")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# –enable-kernel-poll启用Linux内核poll")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# –enable-hipe启用高性能Erlang")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# –with-ssl 启用ssl包")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# –without-javac不用java编译")]),s._v("\n./configure --prefix"),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/usr/local/erlang --enable-kernel-poll --enable-hipe --enable-threads --enable-smp-support --with-ssl --without-javac\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br")])]),t("p",[s._v("【Erlang】编译并且安装")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("&&")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("make")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("install")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("【Erlang】配置环境变量")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[s._v("vim")]),s._v(" /etc/profile\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# Erlang")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("ERL_HOME")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/usr/local/erlang\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("export")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("PATH")])]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("$PATH")]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$ERL_HOME")]),s._v("/bin\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br")])]),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 使环境变量生效")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("source")]),s._v(" /etc/profile\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("【Erlang】使用 "),t("code",[s._v("erl")]),s._v(" 测试是否安装成功,使用 "),t("code",[s._v("halt().")]),s._v(" 退出")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost otp_src_22.3"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# erl")]),s._v("\nErlang/OTP "),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("22")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("erts-10.7"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("source"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),t("span",{pre:!0,attrs:{class:"token number"}},[s._v("64")]),s._v("-bit"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("smp:1:1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("ds:1:1:10"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("async-threads:1"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("hipe"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),s._v("\n\nEshell V10.7 "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("abort with ^G"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token operator"}},[t("span",{pre:!0,attrs:{class:"token file-descriptor important"}},[s._v("1")]),s._v(">")]),s._v(" halt"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),s._v(". "),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#退出")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("p",[s._v("【RabbitMQ】安装")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#[root@localhost opt]# rpm -ivh rabbitmq-server-3.8.14-1.el7.noarch.rpm")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#警告:rabbitmq-server-3.8.14-1.el7.noarch.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 6026dfca: NOKEY")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#错误:依赖检测失败:")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#\terlang >= 21.3 被 rabbitmq-server-3.8.14-1.el7.noarch 需要")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("#\tsocat 被 rabbitmq-server-3.8.14-1.el7.noarch 需要")]),s._v("\n\t\n"),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("rpm")]),s._v(" -ivh --nodeps rabbitmq-server-3.8.14-1.el7.noarch.rpm\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br")])]),t("p",[s._v("【RabbitMQ】查看位置")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost opt"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# whereis rabbitmq")]),s._v("\nrabbitmq: /usr/lib/rabbitmq /etc/rabbitmq\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("p",[s._v("【RabbitMQ】主配置文件")]),s._v(" "),t("p",[s._v("在 /etc/rabbitmq 新建主配置文件 rabbitmq.conf,rabbitmq.conf允许配置RabbitMQ服务器和插件。从RabbitMQ 3.7.0开始,格式为sysctl格式。")]),s._v(" "),t("p",[s._v("以下为最小配置:")]),s._v(" "),t("div",{staticClass:"language-properties line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-properties"}},[t("code",[t("span",{pre:!0,attrs:{class:"token attr-name"}},[s._v("loopback_users.guest")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token attr-value"}},[s._v("false")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("更多配置请查看:")]),s._v(" "),t("p",[t("a",{attrs:{href:"https://www.rabbitmq.com/configure.html#config-file",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://www.rabbitmq.com/configure.html#config-file"),t("OutboundLink")],1)]),s._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/rabbitmq/rabbitmq-server/blob/v3.8.x/deps/rabbit/docs/rabbitmq.conf.example",target:"_blank",rel:"noopener noreferrer"}},[s._v("rabbitmq.conf.example"),t("OutboundLink")],1)]),s._v(" "),t("p",[s._v("【RabbitMQ】启用Web管理控制台")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[s._v("/usr/lib/rabbitmq/bin/rabbitmq-plugins "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("enable")]),s._v(" rabbitmq_management\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br")])]),t("p",[s._v("【RabbitMQ】查看、启动、重启、停止服务")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 查看状态")]),s._v("\nsystemctl status rabbitmq-server\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 启动服务")]),s._v("\nsystemctl start rabbitmq-server\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 重启服务")]),s._v("\nsystemctl restart rabbitmq-server\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# 停止服务")]),s._v("\nsystemctl stop rabbitmq-server\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br")])]),t("p",[s._v("【RabbitMQ】开放端口号")]),s._v(" "),t("div",{staticClass:"language-shell line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-shell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost bin"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# firewall-cmd --add-port=5672/tcp --permanent")]),s._v("\nsuccess\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost bin"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# firewall-cmd --add-port=15672/tcp --permanent")]),s._v("\nsuccess\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("[")]),s._v("root@localhost bin"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("]")]),t("span",{pre:!0,attrs:{class:"token comment"}},[s._v("# firewall-cmd --reload")]),s._v("\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br")])]),t("p",[s._v("在浏览器输入地址:http://192.168.66.133:15672/,账号密码均为:guest")]),s._v(" "),t("img",{attrs:{src:a(635)}}),s._v(" "),t("img",{attrs:{src:a(636)}}),s._v(" "),t("p",[s._v("【RabbitMQ】疑难杂症")]),s._v(" "),t("p",[s._v("Q:3月 22 18:07:05 localhost.localdomain rabbitmq-server[73958]: /usr/lib/rabbitmq/bin/rabbitmq-server: 第 82 行:exec: erl: 未找到")]),s._v(" "),t("p",[s._v("A:在 "),t("code",[s._v("exec")]),s._v(" 前面加入")]),s._v(" "),t("div",{staticClass:"language-bash line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("ERL_HOME")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v("/usr/local/erlang\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v("export")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("PATH")])]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),t("span",{pre:!0,attrs:{class:"token environment constant"}},[s._v("$PATH")]),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(":")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$ERL_HOME")]),s._v("/bin\n")])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br")])]),t("h2",{attrs:{id:"工作原理"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#工作原理"}},[s._v("#")]),s._v(" 工作原理")]),s._v(" "),t("p",[s._v("基本概念:")]),s._v(" "),t("p",[s._v("A "),t("strong",[s._v("producer")]),s._v(" is a user application that sends messages.")]),s._v(" "),t("p",[s._v("A "),t("strong",[s._v("queue")]),s._v(" is a buffer that stores messages.")]),s._v(" "),t("p",[s._v("A "),t("strong",[s._v("consumer")]),s._v(" is a user application that receives messages.")]),s._v(" "),t("p",[s._v("An "),t("strong",[s._v("exchange")]),s._v(" is a very simple thing. On one side it receives messages from producers and the other side it pushes them to queues. There are a few exchange types available: "),t("code",[s._v("direct")]),s._v(", "),t("code",[s._v("topic")]),s._v(", "),t("code",[s._v("headers")]),s._v(" and "),t("code",[s._v("fanout")]),s._v(".")]),s._v(" "),t("p",[s._v("A "),t("strong",[s._v("binding")]),s._v(" is a relationship between an exchange and a queue.")]),s._v(" "),t("p",[t("a",{attrs:{href:"https://www.jianshu.com/p/256c502d09cd",target:"_blank",rel:"noopener noreferrer"}},[s._v("RabbitMQ核心概念以及工作原理"),t("OutboundLink")],1)]),s._v(" "),t("p",[t("a",{attrs:{href:"https://blog.csdn.net/weixin_41231928/article/details/104886907",target:"_blank",rel:"noopener noreferrer"}},[s._v("RabbitMQ消息队列工作原理及集成使用"),t("OutboundLink")],1)]),s._v(" "),t("h2",{attrs:{id:"消息模型"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#消息模型"}},[s._v("#")]),s._v(" 消息模型")]),s._v(" "),t("p",[t("a",{attrs:{href:"https://www.rabbitmq.com/getstarted.html",target:"_blank",rel:"noopener noreferrer"}},[s._v("https://www.rabbitmq.com/getstarted.html"),t("OutboundLink")],1)]),s._v(" "),t("h3",{attrs:{id:"hello-world-简单模式"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hello-world-简单模式"}},[s._v("#")]),s._v(" Hello World(简单模式)")]),s._v(" "),t("p",[s._v("一个生产者,一个消费者,生产者和消费者直接跟队列打交道。(点对点,直连)")]),s._v(" "),t("img",{attrs:{src:a(637)}}),s._v(" "),t("h3",{attrs:{id:"work-queues-工作队列"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#work-queues-工作队列"}},[s._v("#")]),s._v(" Work Queues(工作队列)")]),s._v(" "),t("p",[s._v("工作队列,任务队列。有多个消费者,消息可以平均分发到消费者,也可以多劳多得。")]),s._v(" "),t("img",{attrs:{src:a(638)}}),s._v(" "),t("h3",{attrs:{id:"publish-subscribe-发布订阅"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#publish-subscribe-发布订阅"}},[s._v("#")]),s._v(" Publish/Subscribe(发布订阅)")]),s._v(" "),t("p",[s._v("发布/订阅。在该模型中,交换机会将接收的消息广播到它所知道的所有队列中。exchange=fanout")]),s._v(" "),t("img",{attrs:{src:a(639)}}),s._v(" "),t("h3",{attrs:{id:"routing-静态路由"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#routing-静态路由"}},[s._v("#")]),s._v(" Routing(静态路由)")]),s._v(" "),t("p",[s._v("静态路由。生产者发送消息给交换机,交换机根据路由键转发到对应的队列,然后由监听对应队列的消费者消费。exchange=direct")]),s._v(" "),t("img",{attrs:{src:a(640)}}),s._v(" "),t("h3",{attrs:{id:"topics-动态路由"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#topics-动态路由"}},[s._v("#")]),s._v(" Topics(动态路由)")]),s._v(" "),t("p",[s._v("动态路由。与静态路由不同,路由键是可以由多个单词组成,每个单词以"),t("code",[s._v(".")]),s._v("分隔。可以使用"),t("code",[s._v("*")]),s._v("及"),t("code",[s._v("#")]),s._v("。exchange=topic")]),s._v(" "),t("p",[t("code",[s._v("*")]),s._v("(star) can substitute for exactly one word.一个单词。")]),s._v(" "),t("p",[t("code",[s._v("#")]),s._v(" (hash) can substitute for zero or more words.零个或多个单词。")]),s._v(" "),t("img",{attrs:{src:a(641)}}),s._v(" "),t("h2",{attrs:{id:"应用场景"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#应用场景"}},[s._v("#")]),s._v(" 应用场景")]),s._v(" "),t("ul",[t("li",[s._v("异步处理")]),s._v(" "),t("li",[s._v("应用解耦")]),s._v(" "),t("li",[s._v("流量削峰")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/91.438746a7.js b/assets/js/91.438746a7.js new file mode 100644 index 00000000..b28af0b5 --- /dev/null +++ b/assets/js/91.438746a7.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[91],{751:function(t,r,n){"use strict";n.r(r);var o=n(7),s=Object(o.a)({},(function(){var t=this.$createElement,r=this._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[r("p",[r("a",{attrs:{href:"http://springfox.github.io/springfox/docs/current/",target:"_blank",rel:"noopener noreferrer"}},[this._v("http://springfox.github.io/springfox/docs/current/"),r("OutboundLink")],1)]),this._v(" "),r("p",[r("a",{attrs:{href:"http://springfox.github.io/springfox/docs/current/#springfox-spring-mvc-and-spring-boot",target:"_blank",rel:"noopener noreferrer"}},[this._v("http://springfox.github.io/springfox/docs/current/#springfox-spring-mvc-and-spring-boot"),r("OutboundLink")],1)])])}),[],!1,null,null,null);r.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/92.183d7b02.js b/assets/js/92.183d7b02.js new file mode 100644 index 00000000..ce2ff4e0 --- /dev/null +++ b/assets/js/92.183d7b02.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[92],{752:function(t,e,n){"use strict";n.r(e);var s=n(7),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/94.9259ce5d.js b/assets/js/94.9259ce5d.js new file mode 100644 index 00000000..1a1ee1ba --- /dev/null +++ b/assets/js/94.9259ce5d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{761:function(t,a,s){"use strict";s.r(a);var e=s(7),r=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("测试邮件服务器是否正常运行:")]),t._v(" "),s("h2",{attrs:{id:"邮箱账号测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#邮箱账号测试"}},[t._v("#")]),t._v(" 邮箱账号测试")]),t._v(" "),s("p",[t._v("使用已配置好的邮箱账号通过邮件客户端(如Outlook、Thunderbird等)登录邮件服务器,并发送、接收邮件。确保账号能够正常登录和发送邮件,并能够收到其他邮箱发送的邮件。")]),t._v(" "),s("h2",{attrs:{id:"网络连通性测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#网络连通性测试"}},[t._v("#")]),t._v(" 网络连通性测试")]),t._v(" "),s("p",[t._v('使用ping命令测试邮件服务器的网络连通性。在命令提示符(Windows)或终端(Linux/macOS)中,输入"ping [邮件服务器的IP地址或域名]",然后观察ping的结果。如果能够收到回复,表示网络连通正常。')]),t._v(" "),s("h2",{attrs:{id:"端口连通性测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#端口连通性测试"}},[t._v("#")]),t._v(" 端口连通性测试")]),t._v(" "),s("p",[t._v('使用telnet命令测试邮件服务器的端口连通性。在命令提示符或终端中输入"telnet [邮件服务器的IP地址或域名] [端口号]"进行测试。常用的SMTP端口是25,IMAP端口是143或993,POP3端口是110或995。如果能够连接成功,并且能够发送和接收数据,表示端口连通正常。')]),t._v(" "),s("h2",{attrs:{id:"dns解析测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#dns解析测试"}},[t._v("#")]),t._v(" DNS解析测试")]),t._v(" "),s("p",[t._v("确保你的域名已经正确地解析到邮件服务器的IP地址。可以使用nslookup命令或其他在线DNS(Domain Name System)查询工具来查询域名解析是否正确。")]),t._v(" "),s("h2",{attrs:{id:"smtp服务测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#smtp服务测试"}},[t._v("#")]),t._v(" SMTP服务测试")]),t._v(" "),s("p",[t._v("使用telnet工具连接到邮件服务器的SMTP端口(默认为25),并手动发送一封测试邮件。首先,执行telnet <邮件服务器IP地址> 25命令,然后按照SMTP协议格式发送一封测试邮件。如果能够成功发送并收到确认回复,则说明SMTP服务正常。")]),t._v(" "),s("h2",{attrs:{id:"pop3-imap服务测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#pop3-imap服务测试"}},[t._v("#")]),t._v(" POP3/IMAP服务测试")]),t._v(" "),s("p",[t._v("使用telnet工具连接到邮件服务器的POP3或IMAP端口(默认为110和143),并手动进行身份验证、收取邮件等操作。首先,执行telnet <邮件服务器IP地址> 命令,然后按照POP3或IMAP协议格式进行身份验证和收取邮件等操作。如果能够成功连接并进行正常操作,则说明POP3/IMAP服务正常。")]),t._v(" "),s("h2",{attrs:{id:"邮件传输测试"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#邮件传输测试"}},[t._v("#")]),t._v(" 邮件传输测试")]),t._v(" "),s("p",[t._v("使用命令行工具(如nc、curl等)模拟发送一封邮件,并查看邮件传输过程中的日志信息。通过观察日志信息,可以判断邮件是否成功从发件人传输到收件人。")]),t._v(" "),s("h2",{attrs:{id:"邮件队列监控"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#邮件队列监控"}},[t._v("#")]),t._v(" 邮件队列监控")]),t._v(" "),s("p",[t._v("通过监控邮件服务器的邮件队列,检查是否有大量的待发送的邮件堆积在队列中。大量待发送的邮件可能表明邮件服务器存在问题,如网络连接问题、SMTP服务器配置错误等。可以通过命令行工具或者邮件服务器的管理界面来监控邮件队列。")])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/95.1ac6ad2d.js b/assets/js/95.1ac6ad2d.js new file mode 100644 index 00000000..cb9bc249 --- /dev/null +++ b/assets/js/95.1ac6ad2d.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[95],{762:function(t,n,e){"use strict";e.r(n);var o=e(7),r=Object(o.a)({},(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[e("strong",[t._v("乐观锁")]),t._v(":总是假设最好的情况,每次拿数据时都认为别人不会修改,因此不会上锁,但在更新时会判断一下在此期间别人有没有更新这个数据,可以使用"),e("strong",[t._v("版本号机制")]),t._v("。适用于"),e("strong",[t._v("读多写少")]),t._v("的场景。")]),t._v(" "),e("p",[e("strong",[t._v("悲观锁")]),t._v(":总是假设最坏的情况,每次拿到数据后都会认为别人会修改该数据,因此每次拿数据时都会上锁,阻塞其他人。MySQL中的锁机制:行锁,表锁,读锁,写锁;Java中的synchronized和ReentrantLock独占锁。适用于"),e("strong",[t._v("读少写多")]),t._v("的场景。")])])}),[],!1,null,null,null);n.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/app.889b2845.js b/assets/js/app.889b2845.js new file mode 100644 index 00000000..59e45c87 --- /dev/null +++ b/assets/js/app.889b2845.js @@ -0,0 +1,83 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(e){function t(t){for(var r,i,s=t[0],l=t[1],c=t[2],p=0,f=[];p=0&&Math.floor(t)===t&&isFinite(e)}function d(e){return a(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function h(e){return null==e?"":Array.isArray(e)||u(e)&&e.toString===c?JSON.stringify(e,null,2):String(e)}function v(e){var t=parseFloat(e);return isNaN(t)?e:t}function g(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o-1)return e.splice(n,1)}}var b=Object.prototype.hasOwnProperty;function w(e,t){return b.call(e,t)}function x(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var _=/-(\w)/g,k=x((function(e){return e.replace(_,(function(e,t){return t?t.toUpperCase():""}))})),S=x((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),C=/\B([A-Z])/g,O=x((function(e){return e.replace(C,"-$1").toLowerCase()}));var T=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function A(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function $(e,t){for(var n in t)e[n]=t[n];return e}function j(e){for(var t={},n=0;n0,Y=J&&J.indexOf("edge/")>0,X=(J&&J.indexOf("android"),J&&/iphone|ipad|ipod|ios/.test(J)||"ios"===W),Z=(J&&/chrome\/\d+/.test(J),J&&/phantomjs/.test(J),J&&J.match(/firefox\/(\d+)/)),ee={}.watch,te=!1;if(H)try{var ne={};Object.defineProperty(ne,"passive",{get:function(){te=!0}}),window.addEventListener("test-passive",null,ne)}catch(e){}var re=function(){return void 0===q&&(q=!H&&!Q&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),q},oe=H&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ae(e){return"function"==typeof e&&/native code/.test(e.toString())}var ie,se="undefined"!=typeof Symbol&&ae(Symbol)&&"undefined"!=typeof Reflect&&ae(Reflect.ownKeys);ie="undefined"!=typeof Set&&ae(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var le=P,ce=0,ue=function(){this.id=ce++,this.subs=[]};ue.prototype.addSub=function(e){this.subs.push(e)},ue.prototype.removeSub=function(e){y(this.subs,e)},ue.prototype.depend=function(){ue.target&&ue.target.addDep(this)},ue.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t-1)if(a&&!w(o,"default"))i=!1;else if(""===i||i===O(e)){var l=Be(String,o.type);(l<0||s0&&(pt((l=e(l,(n||"")+"_"+r))[0])&&pt(u)&&(p[c]=me(u.text+l[0].text),l.shift()),p.push.apply(p,l)):s(l)?pt(u)?p[c]=me(u.text+l):""!==l&&p.push(me(l)):pt(l)&&pt(u)?p[c]=me(u.text+l.text):(i(t._isVList)&&a(l.tag)&&o(l.key)&&a(n)&&(l.key="__vlist"+n+"_"+r+"__"),p.push(l)));return p}(e):void 0}function pt(e){return a(e)&&a(e.text)&&!1===e.isComment}function ft(e,t){if(e){for(var n=Object.create(null),r=se?Reflect.ownKeys(e):Object.keys(e),o=0;o0,i=e?!!e.$stable:!a,s=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(i&&n&&n!==r&&s===n.$key&&!a&&!n.$hasNormal)return n;for(var l in o={},e)e[l]&&"$"!==l[0]&&(o[l]=mt(t,l,e[l]))}else o={};for(var c in t)c in o||(o[c]=yt(t,c));return e&&Object.isExtensible(e)&&(e._normalized=o),U(o,"$stable",i),U(o,"$key",s),U(o,"$hasNormal",a),o}function mt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({}),t=(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:ut(e))&&e[0];return e&&(!t||1===e.length&&t.isComment&&!vt(t))?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function yt(e,t){return function(){return e[t]}}function bt(e,t){var n,r,o,i,s;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,o=e.length;rdocument.createEvent("Event").timeStamp&&(cn=function(){return un.now()})}function pn(){var e,t;for(ln=cn(),an=!0,tn.sort((function(e,t){return e.id-t.id})),sn=0;snsn&&tn[n].id>e.id;)n--;tn.splice(n+1,0,e)}else tn.push(e);on||(on=!0,nt(pn))}}(this)},dn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||l(e)||this.deep){var t=this.value;if(this.value=e,this.user){var n='callback for watcher "'+this.expression+'"';Ve(this.cb,this.vm,[e,t],this.vm,n)}else this.cb.call(this.vm,e,t)}}},dn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},dn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},dn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||y(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var hn={enumerable:!0,configurable:!0,get:P,set:P};function vn(e,t,n){hn.get=function(){return this[t][n]},hn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,hn)}function gn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},o=e.$options._propKeys=[];e.$parent&&ke(!1);var a=function(a){o.push(a);var i=Ne(a,t,n,e);Oe(r,a,i),a in e||vn(e,"_props",a)};for(var i in t)a(i);ke(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?P:T(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;u(t=e._data="function"==typeof t?function(e,t){fe();try{return e.call(t,t)}catch(e){return qe(e,t,"data()"),{}}finally{de()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,o=(e.$options.methods,n.length);for(;o--;){var a=n[o];0,r&&w(r,a)||(i=void 0,36!==(i=(a+"").charCodeAt(0))&&95!==i&&vn(e,"_data",a))}var i;Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=re();for(var o in t){var a=t[o],i="function"==typeof a?a:a.get;0,r||(n[o]=new dn(e,i||P,P,mn)),o in e||yn(e,o,a)}}(e,t.computed),t.watch&&t.watch!==ee&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!p(e)&&e.test(t)}function An(e,t){var n=e.cache,r=e.keys,o=e._vnode;for(var a in n){var i=n[a];if(i){var s=i.name;s&&!t(s)&&$n(n,a,r,o)}}}function $n(e,t,n,r){var o=e[t];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),e[t]=null,y(n,t)}!function(e){e.prototype._init=function(e){var t=this;t._uid=_n++,t._isVue=!0,e&&e._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=Re(kn(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Kt(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,n=e.$vnode=t._parentVnode,o=n&&n.context;e.$slots=dt(t._renderChildren,o),e.$scopedSlots=r,e._c=function(t,n,r,o){return Ut(e,t,n,r,o,!1)},e.$createElement=function(t,n,r,o){return Ut(e,t,n,r,o,!0)};var a=n&&n.data;Oe(e,"$attrs",a&&a.attrs||r,null,!0),Oe(e,"$listeners",t._parentListeners||r,null,!0)}(t),en(t,"beforeCreate"),function(e){var t=ft(e.$options.inject,e);t&&(ke(!1),Object.keys(t).forEach((function(n){Oe(e,n,t[n])})),ke(!0))}(t),gn(t),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(t),en(t,"created"),t.$options.el&&t.$mount(t.$options.el)}}(Sn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=Te,e.prototype.$delete=Ae,e.prototype.$watch=function(e,t,n){if(u(t))return xn(this,e,t,n);(n=n||{}).user=!0;var r=new dn(this,e,t,n);if(n.immediate){var o='callback for immediate watcher "'+r.expression+'"';fe(),Ve(t,this,[r.value],this,o),de()}return function(){r.teardown()}}}(Sn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var o=0,a=e.length;o1?A(n):n;for(var r=A(arguments,1),o='event handler for "'+e+'"',a=0,i=n.length;aparseInt(this.max)&&$n(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)$n(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",(function(t){An(e,(function(e){return Tn(t,e)}))})),this.$watch("exclude",(function(t){An(e,(function(e){return!Tn(t,e)}))}))},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=Ht(e),n=t&&t.componentOptions;if(n){var r=On(n),o=this.include,a=this.exclude;if(o&&(!r||!Tn(o,r))||a&&r&&Tn(a,r))return t;var i=this.cache,s=this.keys,l=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;i[l]?(t.componentInstance=i[l].componentInstance,y(s,l),s.push(l)):(this.vnodeToCache=t,this.keyToCache=l),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return F}};Object.defineProperty(e,"config",t),e.util={warn:le,extend:$,mergeOptions:Re,defineReactive:Oe},e.set=Te,e.delete=Ae,e.nextTick=nt,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),D.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,$(e.options.components,Pn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=A(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=Re(this.options,e),this}}(e),Cn(e),function(e){D.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&u(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(Sn),Object.defineProperty(Sn.prototype,"$isServer",{get:re}),Object.defineProperty(Sn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Sn,"FunctionalRenderContext",{value:It}),Sn.version="2.6.14";var En=g("style,class"),Ln=g("input,textarea,option,select,progress"),In=g("contenteditable,draggable,spellcheck"),Mn=g("events,caret,typing,plaintext-only"),Rn=g("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Dn="http://www.w3.org/1999/xlink",Nn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Fn=function(e){return Nn(e)?e.slice(6,e.length):""},zn=function(e){return null==e||!1===e};function Un(e){for(var t=e.data,n=e,r=e;a(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(t=Bn(r.data,t));for(;a(n=n.parent);)n&&n.data&&(t=Bn(t,n.data));return function(e,t){if(a(e)||a(t))return qn(e,Vn(t));return""}(t.staticClass,t.class)}function Bn(e,t){return{staticClass:qn(e.staticClass,t.staticClass),class:a(e.class)?[e.class,t.class]:t.class}}function qn(e,t){return e?t?e+" "+t:e:t||""}function Vn(e){return Array.isArray(e)?function(e){for(var t,n="",r=0,o=e.length;r-1?dr(e,t,n):Rn(t)?zn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):In(t)?e.setAttribute(t,function(e,t){return zn(t)||"false"===t?"false":"contenteditable"===e&&Mn(t)?t:"true"}(t,n)):Nn(t)?zn(n)?e.removeAttributeNS(Dn,Fn(t)):e.setAttributeNS(Dn,t,n):dr(e,t,n)}function dr(e,t,n){if(zn(n))e.removeAttribute(t);else{if(K&&!G&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var hr={create:pr,update:pr};function vr(e,t){var n=t.elm,r=t.data,i=e.data;if(!(o(r.staticClass)&&o(r.class)&&(o(i)||o(i.staticClass)&&o(i.class)))){var s=Un(t),l=n._transitionClasses;a(l)&&(s=qn(s,Vn(l))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var gr,mr={create:vr,update:vr};function yr(e,t,n){var r=gr;return function o(){var a=t.apply(null,arguments);null!==a&&xr(e,o,n,r)}}var br=Je&&!(Z&&Number(Z[1])<=53);function wr(e,t,n,r){if(br){var o=ln,a=t;t=a._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=o||e.timeStamp<=0||e.target.ownerDocument!==document)return a.apply(this,arguments)}}gr.addEventListener(e,t,te?{capture:n,passive:r}:n)}function xr(e,t,n,r){(r||gr).removeEventListener(e,t._wrapper||t,n)}function _r(e,t){if(!o(e.data.on)||!o(t.data.on)){var n=t.data.on||{},r=e.data.on||{};gr=t.elm,function(e){if(a(e.__r)){var t=K?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}a(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(n),st(n,r,wr,xr,yr,t.context),gr=void 0}}var kr,Sr={create:_r,update:_r};function Cr(e,t){if(!o(e.data.domProps)||!o(t.data.domProps)){var n,r,i=t.elm,s=e.data.domProps||{},l=t.data.domProps||{};for(n in a(l.__ob__)&&(l=t.data.domProps=$({},l)),s)n in l||(i[n]="");for(n in l){if(r=l[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),r===s[n])continue;1===i.childNodes.length&&i.removeChild(i.childNodes[0])}if("value"===n&&"PROGRESS"!==i.tagName){i._value=r;var c=o(r)?"":String(r);Or(i,c)&&(i.value=c)}else if("innerHTML"===n&&Wn(i.tagName)&&o(i.innerHTML)){(kr=kr||document.createElement("div")).innerHTML=""+r+"";for(var u=kr.firstChild;i.firstChild;)i.removeChild(i.firstChild);for(;u.firstChild;)i.appendChild(u.firstChild)}else if(r!==s[n])try{i[n]=r}catch(e){}}}}function Or(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,r=e._vModifiers;if(a(r)){if(r.number)return v(n)!==v(t);if(r.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var Tr={create:Cr,update:Cr},Ar=x((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}})),t}));function $r(e){var t=jr(e.style);return e.staticStyle?$(e.staticStyle,t):t}function jr(e){return Array.isArray(e)?j(e):"string"==typeof e?Ar(e):e}var Pr,Er=/^--/,Lr=/\s*!important$/,Ir=function(e,t,n){if(Er.test(t))e.style.setProperty(t,n);else if(Lr.test(n))e.style.setProperty(O(t),n.replace(Lr,""),"important");else{var r=Rr(t);if(Array.isArray(n))for(var o=0,a=n.length;o-1?t.split(Fr).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function Ur(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(Fr).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function Br(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&$(t,qr(e.name||"v")),$(t,e),t}return"string"==typeof e?qr(e):void 0}}var qr=x((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),Vr=H&&!G,Hr="transition",Qr="transitionend",Wr="animation",Jr="animationend";Vr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Hr="WebkitTransition",Qr="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Wr="WebkitAnimation",Jr="webkitAnimationEnd"));var Kr=H?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Gr(e){Kr((function(){Kr(e)}))}function Yr(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),zr(e,t))}function Xr(e,t){e._transitionClasses&&y(e._transitionClasses,t),Ur(e,t)}function Zr(e,t,n){var r=to(e,t),o=r.type,a=r.timeout,i=r.propCount;if(!o)return n();var s="transition"===o?Qr:Jr,l=0,c=function(){e.removeEventListener(s,u),n()},u=function(t){t.target===e&&++l>=i&&c()};setTimeout((function(){l0&&(n="transition",u=i,p=a.length):"animation"===t?c>0&&(n="animation",u=c,p=l.length):p=(n=(u=Math.max(i,c))>0?i>c?"transition":"animation":null)?"transition"===n?a.length:l.length:0,{type:n,timeout:u,propCount:p,hasTransform:"transition"===n&&eo.test(r[Hr+"Property"])}}function no(e,t){for(;e.length1}function lo(e,t){!0!==t.data.show&&oo(t)}var co=function(e){var t,n,r={},l=e.modules,c=e.nodeOps;for(t=0;th?b(e,o(n[m+1])?null:n[m+1].elm,n,d,m,r):d>m&&x(t,f,h)}(f,g,m,n,u):a(m)?(a(e.text)&&c.setTextContent(f,""),b(f,null,m,0,m.length-1,n)):a(g)?x(g,0,g.length-1):a(e.text)&&c.setTextContent(f,""):e.text!==t.text&&c.setTextContent(f,t.text),a(h)&&a(d=h.hook)&&a(d=d.postpatch)&&d(e,t)}}}function C(e,t,n){if(i(n)&&a(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r-1,i.selected!==a&&(i.selected=a);else if(I(vo(i),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));o||(e.selectedIndex=-1)}}function ho(e,t){return t.every((function(t){return!I(t,e)}))}function vo(e){return"_value"in e?e._value:e.value}function go(e){e.target.composing=!0}function mo(e){e.target.composing&&(e.target.composing=!1,yo(e.target,"input"))}function yo(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function bo(e){return!e.componentInstance||e.data&&e.data.transition?e:bo(e.componentInstance._vnode)}var wo={model:uo,show:{bind:function(e,t,n){var r=t.value,o=(n=bo(n)).data&&n.data.transition,a=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&o?(n.data.show=!0,oo(n,(function(){e.style.display=a}))):e.style.display=r?a:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=bo(n)).data&&n.data.transition?(n.data.show=!0,r?oo(n,(function(){e.style.display=e.__vOriginalDisplay})):ao(n,(function(){e.style.display="none"}))):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,o){o||(e.style.display=e.__vOriginalDisplay)}}},xo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function _o(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?_o(Ht(t.children)):e}function ko(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var o=n._parentListeners;for(var a in o)t[k(a)]=o[a];return t}function So(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var Co=function(e){return e.tag||vt(e)},Oo=function(e){return"show"===e.name},To={name:"transition",props:xo,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(Co)).length){0;var r=this.mode;0;var o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var a=_o(o);if(!a)return o;if(this._leaving)return So(e,o);var i="__transition-"+this._uid+"-";a.key=null==a.key?a.isComment?i+"comment":i+a.tag:s(a.key)?0===String(a.key).indexOf(i)?a.key:i+a.key:a.key;var l=(a.data||(a.data={})).transition=ko(this),c=this._vnode,u=_o(c);if(a.data.directives&&a.data.directives.some(Oo)&&(a.data.show=!0),u&&u.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(a,u)&&!vt(u)&&(!u.componentInstance||!u.componentInstance._vnode.isComment)){var p=u.data.transition=$({},l);if("out-in"===r)return this._leaving=!0,lt(p,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),So(e,o);if("in-out"===r){if(vt(a))return c;var f,d=function(){f()};lt(l,"afterEnter",d),lt(l,"enterCancelled",d),lt(p,"delayLeave",(function(e){f=e}))}}return o}}},Ao=$({tag:String,moveClass:String},xo);function $o(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function jo(e){e.data.newPos=e.elm.getBoundingClientRect()}function Po(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,o=t.top-n.top;if(r||o){e.data.moved=!0;var a=e.elm.style;a.transform=a.WebkitTransform="translate("+r+"px,"+o+"px)",a.transitionDuration="0s"}}delete Ao.mode;var Eo={Transition:To,TransitionGroup:{props:Ao,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var o=Yt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,o(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],a=this.children=[],i=ko(this),s=0;s-1?Kn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Kn[e]=/HTMLUnknownElement/.test(t.toString())},$(Sn.options.directives,wo),$(Sn.options.components,Eo),Sn.prototype.__patch__=H?co:P,Sn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=ge),en(e,"beforeMount"),r=function(){e._update(e._render(),n)},new dn(e,r,P,{before:function(){e._isMounted&&!e._isDestroyed&&en(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,en(e,"mounted")),e}(this,e=e&&H?function(e){if("string"==typeof e){var t=document.querySelector(e);return t||document.createElement("div")}return e}(e):void 0,t)},H&&setTimeout((function(){F.devtools&&oe&&oe.emit("init",Sn)}),0),t.default=Sn},function(e,t,n){var r=n(3),o=n(35).f,a=n(34),i=n(16),s=n(108),l=n(154),c=n(86);e.exports=function(e,t){var n,u,p,f,d,h=e.target,v=e.global,g=e.stat;if(n=v?r:g?r[h]||s(h,{}):(r[h]||{}).prototype)for(u in t){if(f=t[u],p=e.noTargetGet?(d=o(n,u))&&d.value:n[u],!c(v?u:h+(g?".":"#")+u,e.forced)&&void 0!==p){if(typeof f==typeof p)continue;l(f,p)}(e.sham||p&&p.sham)&&a(f,"sham",!0),i(n,u,f,e)}}},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){var n=function(e){return e&&e.Math==Math&&e};e.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof global&&global)||function(){return this}()||Function("return this")()},function(e,t,n){var r=n(3),o=n(78),a=n(13),i=n(79),s=n(109),l=n(147),c=o("wks"),u=r.Symbol,p=l?u:u&&u.withoutSetter||i;e.exports=function(e){return a(c,e)&&(s||"string"==typeof c[e])||(s&&a(u,e)?c[e]=u[e]:c[e]=p("Symbol."+e)),c[e]}},function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var r=n(0); +/** + * vue-class-component v7.2.6 + * (c) 2015-present Evan You + * @license MIT + */function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t1&&void 0!==arguments[1]?arguments[1]:{};t.name=t.name||e._componentTag||e.name;var n=e.prototype;Object.getOwnPropertyNames(n).forEach((function(e){if("constructor"!==e)if(d.indexOf(e)>-1)t[e]=n[e];else{var r=Object.getOwnPropertyDescriptor(n,e);void 0!==r.value?"function"==typeof r.value?(t.methods||(t.methods={}))[e]=r.value:(t.mixins||(t.mixins=[])).push({data:function(){return a({},e,r.value)}}):(r.get||r.set)&&((t.computed||(t.computed={}))[e]={get:r.get,set:r.set})}})),(t.mixins||(t.mixins=[])).push({data:function(){return f(this,e)}});var o=e.__decorators__;o&&(o.forEach((function(e){return e(t)})),delete e.__decorators__);var i=Object.getPrototypeOf(e.prototype),c=i instanceof r.default?i.constructor:r.default,u=c.extend(t);return g(u,e,c),s()&&l(u,e),u}var v={prototype:!0,arguments:!0,callee:!0,caller:!0};function g(e,t,n){Object.getOwnPropertyNames(t).forEach((function(r){if(!v[r]){var a=Object.getOwnPropertyDescriptor(e,r);if(!a||a.configurable){var i,s,l=Object.getOwnPropertyDescriptor(t,r);if(!u){if("cid"===r)return;var c=Object.getOwnPropertyDescriptor(n,r);if(i=l.value,s=o(i),null!=i&&("object"===s||"function"===s)&&c&&c.value===l.value)return}0,Object.defineProperty(e,r,l)}}}))}function m(e){return"function"==typeof e?h(e):function(t){return h(t,e)}}m.registerHooks=function(e){d.push.apply(d,i(e))},t.b=m},function(e,t){e.exports=function(e){return"function"==typeof e}},function(e,t,n){"use strict";function r(e,t,n,r,o,a,i,s){var l,c="function"==typeof e?e.options:e;if(t&&(c.render=t,c.staticRenderFns=n,c._compiled=!0),r&&(c.functional=!0),a&&(c._scopeId="data-v-"+a),i?(l=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(i)},c._ssrRegister=l):o&&(l=s?function(){o.call(this,(c.functional?this.parent:this).$root.$options.shadowRoot)}:o),l)if(c.functional){c._injectStyles=l;var u=c.render;c.render=function(e,t){return l.call(t),u(e,t)}}else{var p=c.beforeCreate;c.beforeCreate=p?[].concat(p,l):[l]}return{exports:e,options:c}}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));n(74),n(53),n(21),n(240),n(51),n(52),n(173),n(374),n(105);var r=n(69);function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t1?arguments[1]:void 0)}})},function(e,t,n){var r=n(60),o=n(19);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(3),o=n(6),a=function(e){return o(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?a(r[e]):r[e]&&r[e][t]}},function(e,t,n){"use strict";var r=n(170).charAt,o=n(12),a=n(40),i=n(153),s=a.set,l=a.getterFor("String Iterator");i(String,"String",(function(e){s(this,{type:"String Iterator",string:o(e),index:0})}),(function(){var e,t=l(this),n=t.string,o=t.index;return o>=n.length?{value:void 0,done:!0}:(e=r(n,o),t.index+=e.length,{value:e,done:!1})}))},function(e,t,n){e.exports=n(410)},function(e,t,n){var r=n(3),o=n(171),a=n(172),i=n(145),s=n(34),l=n(4),c=l("iterator"),u=l("toStringTag"),p=i.values,f=function(e,t){if(e){if(e[c]!==p)try{s(e,c,p)}catch(t){e[c]=p}if(e[u]||s(e,u,t),o[t])for(var n in i)if(e[n]!==i[n])try{s(e,n,i[n])}catch(t){e[n]=i[n]}}};for(var d in o)f(r[d]&&r[d].prototype,d);f(a,"DOMTokenList")},function(e,t,n){"use strict";n.d(t,"d",(function(){return a})),n.d(t,"j",(function(){return i})),n.d(t,"g",(function(){return l})),n.d(t,"h",(function(){return c})),n.d(t,"i",(function(){return u})),n.d(t,"e",(function(){return p})),n.d(t,"f",(function(){return f})),n.d(t,"l",(function(){return d})),n.d(t,"m",(function(){return h})),n.d(t,"k",(function(){return v})),n.d(t,"c",(function(){return m})),n.d(t,"a",(function(){return y})),n.d(t,"b",(function(){return b}));n(37),n(56),n(244),n(385),n(187),n(44),n(51),n(52),n(21),n(94),n(57),n(72),n(245),n(246);var r=/#.*$/,o=/\.(md|html)$/,a=/\/$/,i=/^(https?:|mailto:|tel:)/;function s(e){return decodeURI(e).replace(r,"").replace(o,"")}function l(e){return i.test(e)}function c(e){return/^mailto:/.test(e)}function u(e){return/^tel:/.test(e)}function p(e){if(l(e))return e;var t=e.match(r),n=t?t[0]:"",o=s(e);return a.test(o)?e:o+".html"+n}function f(e,t){var n=e.hash,o=function(e){var t=e.match(r);if(t)return t[0]}(t);return(!o||n===o)&&s(e.path)===s(t)}function d(e,t,n){n&&(t=function(e,t,n){var r=e.charAt(0);if("/"===r)return e;if("?"===r||"#"===r)return t+e;var o=t.split("/");n&&o[o.length-1]||o.pop();for(var a=e.replace(/^\//,"").split("/"),i=0;i3&&void 0!==arguments[3]?arguments[3]:1;if("string"==typeof t)return d(n,t,r);if(Array.isArray(t))return Object.assign(d(n,t[0],r),{title:t[1]});o>3&&console.error("[vuepress] detected a too deep nested sidebar group.");var a=t.children||[];return 0===a.length&&t.path?Object.assign(d(n,t.path,r),{title:t.title}):{type:"group",path:t.path,title:t.title,sidebarDepth:t.sidebarDepth,children:a.map((function(t){return e(t,n,r,o+1)})),collapsable:!1!==t.collapsable}}(e,o,s)})):[]}function v(e){return Object.assign(e,{type:e.items&&e.items.length?"links":"link"})}function g(e){return e?new Date(e).getTime():0}function m(e,t){var n=g(e.frontmatter.date),r=g(t.frontmatter.date);return 0===n||0===r?0:r-n}function y(e){var t=document.createElement("link");t.rel="stylesheet",t.href=e,document.head.append(t)}function b(e){var t=document.createElement("script");t.src=e,document.head.append(t)}},function(e,t,n){var r=n(189),o="object"==typeof self&&self&&self.Object===Object&&self,a=r||o||Function("return this")();e.exports=a},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));n(105);function r(e,t){for(var n=0;n"+e+"<\/script>"},h=function(e){e.write(d("")),e.close();var t=e.parentWindow.Object;return e=null,t},v=function(){try{r=new ActiveXObject("htmlfile")}catch(e){}var e,t;v="undefined"!=typeof document?document.domain&&r?h(r):((t=c("iframe")).style.display="none",l.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(d("document.F=Object")),e.close(),e.F):h(r);for(var n=i.length;n--;)delete v.prototype[i[n]];return v()};s[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(f.prototype=o(e),n=new f,f.prototype=null,n[p]=e):n=v(),void 0===t?n:a(n,t)}},function(e,t,n){var r,o,a,i=n(250),s=n(3),l=n(10),c=n(34),u=n(13),p=n(107),f=n(84),d=n(61),h=s.WeakMap;if(i||p.state){var v=p.state||(p.state=new h),g=v.get,m=v.has,y=v.set;r=function(e,t){if(m.call(v,e))throw new TypeError("Object already initialized");return t.facade=e,y.call(v,e,t),t},o=function(e){return g.call(v,e)||{}},a=function(e){return m.call(v,e)}}else{var b=f("state");d[b]=!0,r=function(e,t){if(u(e,b))throw new TypeError("Object already initialized");return t.facade=e,c(e,b,t),t},o=function(e){return u(e,b)?e[b]:{}},a=function(e){return u(e,b)}}e.exports={set:r,get:o,has:a,enforce:function(e){return a(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!l(t)||(n=o(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){var r=n(296),o=n(299);e.exports=function(e,t){var n=o(e,t);return r(n)?n:void 0}},function(e,t,n){var r=n(398),o=n(218),a=/[T ]/,i=/:/,s=/^(\d{2})$/,l=[/^([+-]\d{2})$/,/^([+-]\d{3})$/,/^([+-]\d{4})$/],c=/^(\d{4})/,u=[/^([+-]\d{4})/,/^([+-]\d{5})/,/^([+-]\d{6})/],p=/^-(\d{2})$/,f=/^-?(\d{3})$/,d=/^-?(\d{2})-?(\d{2})$/,h=/^-?W(\d{2})$/,v=/^-?W(\d{2})-?(\d{1})$/,g=/^(\d{2}([.,]\d*)?)$/,m=/^(\d{2}):?(\d{2}([.,]\d*)?)$/,y=/^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/,b=/([Z+-].*)$/,w=/^(Z)$/,x=/^([+-])(\d{2})$/,_=/^([+-])(\d{2}):?(\d{2})$/;function k(e,t,n){t=t||0,n=n||0;var r=new Date(0);r.setUTCFullYear(e,0,4);var o=7*t+n+1-(r.getUTCDay()||7);return r.setUTCDate(r.getUTCDate()+o),r}e.exports=function(e,t){if(o(e))return new Date(e.getTime());if("string"!=typeof e)return new Date(e);var n=(t||{}).additionalDigits;n=null==n?2:Number(n);var S=function(e){var t,n={},r=e.split(a);i.test(r[0])?(n.date=null,t=r[0]):(n.date=r[0],t=r[1]);if(t){var o=b.exec(t);o?(n.time=t.replace(o[1],""),n.timezone=o[1]):n.time=t}return n}(e),C=function(e,t){var n,r=l[t],o=u[t];if(n=c.exec(e)||o.exec(e)){var a=n[1];return{year:parseInt(a,10),restDateString:e.slice(a.length)}}if(n=s.exec(e)||r.exec(e)){var i=n[1];return{year:100*parseInt(i,10),restDateString:e.slice(i.length)}}return{year:null}}(S.date,n),O=C.year,T=function(e,t){if(null===t)return null;var n,r,o,a;if(0===e.length)return(r=new Date(0)).setUTCFullYear(t),r;if(n=p.exec(e))return r=new Date(0),o=parseInt(n[1],10)-1,r.setUTCFullYear(t,o),r;if(n=f.exec(e)){r=new Date(0);var i=parseInt(n[1],10);return r.setUTCFullYear(t,0,i),r}if(n=d.exec(e)){r=new Date(0),o=parseInt(n[1],10)-1;var s=parseInt(n[2],10);return r.setUTCFullYear(t,o,s),r}if(n=h.exec(e))return a=parseInt(n[1],10)-1,k(t,a);if(n=v.exec(e)){a=parseInt(n[1],10)-1;var l=parseInt(n[2],10)-1;return k(t,a,l)}return null}(C.restDateString,O);if(T){var A,$=T.getTime(),j=0;if(S.time&&(j=function(e){var t,n,r;if(t=g.exec(e))return(n=parseFloat(t[1].replace(",",".")))%24*36e5;if(t=m.exec(e))return n=parseInt(t[1],10),r=parseFloat(t[2].replace(",",".")),n%24*36e5+6e4*r;if(t=y.exec(e)){n=parseInt(t[1],10),r=parseInt(t[2],10);var o=parseFloat(t[3].replace(",","."));return n%24*36e5+6e4*r+1e3*o}return null}(S.time)),S.timezone)A=6e4*function(e){var t,n;if(t=w.exec(e))return 0;if(t=x.exec(e))return n=60*parseInt(t[2],10),"+"===t[1]?-n:n;if(t=_.exec(e))return n=60*parseInt(t[2],10)+parseInt(t[3],10),"+"===t[1]?-n:n;return 0}(S.timezone);else{var P=$+j,E=new Date(P);A=r(E);var L=new Date(P);L.setDate(E.getDate()+1);var I=r(L)-r(E);I>0&&(A+=I)}return new Date($+j+A)}return new Date(e)}},function(e,t,n){var r=n(1),o=n(3),a=n(6),i=n(32),s=[].slice,l=function(e){return function(t,n){var r=arguments.length>2,o=r?s.call(arguments,2):void 0;return e(r?function(){(a(t)?t:Function(t)).apply(this,o)}:t,n)}};r({global:!0,bind:!0,forced:/MSIE .\./.test(i)},{setTimeout:l(o.setTimeout),setInterval:l(o.setInterval)})},function(e,t,n){"use strict";var r=n(1),o=n(65).map;r({target:"Array",proto:!0,forced:!n(77)("map")},{map:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var r,o,a=n(3),i=n(32),s=a.process,l=a.Deno,c=s&&s.versions||l&&l.version,u=c&&c.v8;u?o=(r=u.split("."))[0]<4?1:r[0]+r[1]:i&&(!(r=i.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=i.match(/Chrome\/(\d+)/))&&(o=r[1]),e.exports=o&&+o},function(e,t,n){var r=n(33);e.exports=function(e,t){var n=e[t];return null==n?void 0:r(n)}},function(e,t,n){var r=n(59),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t,n){var r=n(151),o=n(112).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},function(e,t,n){"use strict";var r=n(1),o=n(178);r({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},function(e,t,n){var r=n(3),o=n(171),a=n(172),i=n(178),s=n(34),l=function(e){if(e&&e.forEach!==i)try{s(e,"forEach",i)}catch(t){e.forEach=i}};for(var c in o)o[c]&&l(r[c]&&r[c].prototype);l(a)},function(e,t,n){"use strict";var r=n(1),o=n(3),a=n(23),i=n(38),s=n(11),l=n(109),c=n(2),u=n(13),p=n(64),f=n(6),d=n(10),h=n(82),v=n(9),g=n(15),m=n(22),y=n(81),b=n(12),w=n(63),x=n(39),_=n(83),k=n(49),S=n(180),C=n(114),O=n(35),T=n(14),A=n(113),$=n(16),j=n(78),P=n(84),E=n(61),L=n(79),I=n(4),M=n(181),R=n(182),D=n(87),N=n(40),F=n(65).forEach,z=P("hidden"),U=I("toPrimitive"),B=N.set,q=N.getterFor("Symbol"),V=Object.prototype,H=o.Symbol,Q=a("JSON","stringify"),W=O.f,J=T.f,K=S.f,G=A.f,Y=j("symbols"),X=j("op-symbols"),Z=j("string-to-symbol-registry"),ee=j("symbol-to-string-registry"),te=j("wks"),ne=o.QObject,re=!ne||!ne.prototype||!ne.prototype.findChild,oe=s&&c((function(){return 7!=x(J({},"a",{get:function(){return J(this,"a",{value:7}).a}})).a}))?function(e,t,n){var r=W(V,t);r&&delete V[t],J(e,t,n),r&&e!==V&&J(V,t,r)}:J,ae=function(e,t){var n=Y[e]=x(H.prototype);return B(n,{type:"Symbol",tag:e,description:t}),s||(n.description=t),n},ie=function(e,t,n){e===V&&ie(X,t,n),v(e);var r=y(t);return v(n),u(Y,r)?(n.enumerable?(u(e,z)&&e[z][r]&&(e[z][r]=!1),n=x(n,{enumerable:w(0,!1)})):(u(e,z)||J(e,z,w(1,{})),e[z][r]=!0),oe(e,r,n)):J(e,r,n)},se=function(e,t){v(e);var n=m(t),r=_(n).concat(pe(n));return F(r,(function(t){s&&!le.call(n,t)||ie(e,t,n[t])})),e},le=function(e){var t=y(e),n=G.call(this,t);return!(this===V&&u(Y,t)&&!u(X,t))&&(!(n||!u(this,t)||!u(Y,t)||u(this,z)&&this[z][t])||n)},ce=function(e,t){var n=m(e),r=y(t);if(n!==V||!u(Y,r)||u(X,r)){var o=W(n,r);return!o||!u(Y,r)||u(n,z)&&n[z][r]||(o.enumerable=!0),o}},ue=function(e){var t=K(m(e)),n=[];return F(t,(function(e){u(Y,e)||u(E,e)||n.push(e)})),n},pe=function(e){var t=e===V,n=K(t?X:m(e)),r=[];return F(n,(function(e){!u(Y,e)||t&&!u(V,e)||r.push(Y[e])})),r};(l||($((H=function(){if(this instanceof H)throw TypeError("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?b(arguments[0]):void 0,t=L(e),n=function(e){this===V&&n.call(X,e),u(this,z)&&u(this[z],t)&&(this[z][t]=!1),oe(this,t,w(1,e))};return s&&re&&oe(V,t,{configurable:!0,set:n}),ae(t,e)}).prototype,"toString",(function(){return q(this).tag})),$(H,"withoutSetter",(function(e){return ae(L(e),e)})),A.f=le,T.f=ie,O.f=ce,k.f=S.f=ue,C.f=pe,M.f=function(e){return ae(I(e),e)},s&&(J(H.prototype,"description",{configurable:!0,get:function(){return q(this).description}}),i||$(V,"propertyIsEnumerable",le,{unsafe:!0}))),r({global:!0,wrap:!0,forced:!l,sham:!l},{Symbol:H}),F(_(te),(function(e){R(e)})),r({target:"Symbol",stat:!0,forced:!l},{for:function(e){var t=b(e);if(u(Z,t))return Z[t];var n=H(t);return Z[t]=n,ee[n]=t,n},keyFor:function(e){if(!h(e))throw TypeError(e+" is not a symbol");if(u(ee,e))return ee[e]},useSetter:function(){re=!0},useSimple:function(){re=!1}}),r({target:"Object",stat:!0,forced:!l,sham:!s},{create:function(e,t){return void 0===t?x(e):se(x(e),t)},defineProperty:ie,defineProperties:se,getOwnPropertyDescriptor:ce}),r({target:"Object",stat:!0,forced:!l},{getOwnPropertyNames:ue,getOwnPropertySymbols:pe}),r({target:"Object",stat:!0,forced:c((function(){C.f(1)}))},{getOwnPropertySymbols:function(e){return C.f(g(e))}}),Q)&&r({target:"JSON",stat:!0,forced:!l||c((function(){var e=H();return"[null]"!=Q([e])||"{}"!=Q({a:e})||"{}"!=Q(Object(e))}))},{stringify:function(e,t,n){for(var r,o=[e],a=1;arguments.length>a;)o.push(arguments[a++]);if(r=t,(d(t)||void 0!==e)&&!h(e))return p(t)||(t=function(e,t){if(f(r)&&(t=r.call(this,e,t)),!h(t))return t}),o[1]=t,Q.apply(null,o)}});if(!H.prototype[U]){var fe=H.prototype.valueOf;$(H.prototype,U,(function(){return fe.apply(this,arguments)}))}D(H,"Symbol"),E[z]=!0},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t,n){"use strict";var r=n(395),o=n(396),a=n(217);e.exports={formats:a,parse:o,stringify:r}},function(e,t,n){"use strict";var r=n(122),o=n(2),a=n(9),i=n(6),s=n(59),l=n(48),c=n(12),u=n(19),p=n(123),f=n(47),d=n(275),h=n(124),v=n(4)("replace"),g=Math.max,m=Math.min,y="$0"==="a".replace(/./,"$0"),b=!!/./[v]&&""===/./[v]("a","$0");r("replace",(function(e,t,n){var r=b?"$":"$0";return[function(e,n){var r=u(this),o=null==e?void 0:f(e,v);return o?o.call(e,r,n):t.call(c(r),e,n)},function(e,o){var u=a(this),f=c(e);if("string"==typeof o&&-1===o.indexOf(r)&&-1===o.indexOf("$<")){var v=n(t,u,f,o);if(v.done)return v.value}var y=i(o);y||(o=c(o));var b=u.global;if(b){var w=u.unicode;u.lastIndex=0}for(var x=[];;){var _=h(u,f);if(null===_)break;if(x.push(_),!b)break;""===c(_[0])&&(u.lastIndex=p(f,l(u.lastIndex),w))}for(var k,S="",C=0,O=0;O=C&&(S+=f.slice(C,A)+L,C=A+T.length)}return S+f.slice(C)}]}),!!o((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}))||!y||b)},function(e,t,n){"use strict";var r=n(1),o=n(111).indexOf,a=n(50),i=[].indexOf,s=!!i&&1/[1].indexOf(1,-0)<0,l=a("indexOf");r({target:"Array",proto:!0,forced:s||!l},{indexOf:function(e){return s?i.apply(this,arguments)||0:o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));n(94);var r=n(71);n(53),n(66),n(18),n(93),n(24),n(26),n(183);var o=n(101);function a(e){return function(e){if(Array.isArray(e))return Object(r.a)(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||Object(o.a)(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){var t=+e;return t!=t||0===t?0:(t>0?r:n)(t)}},function(e,t,n){var r=n(2),o=n(45),a="".split;e.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==o(e)?a.call(e,""):Object(e)}:Object},function(e,t){e.exports={}},function(e,t){e.exports={}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var r=n(45);e.exports=Array.isArray||function(e){return"Array"==r(e)}},function(e,t,n){var r=n(89),o=n(60),a=n(15),i=n(31),s=n(139),l=[].push,c=function(e){var t=1==e,n=2==e,c=3==e,u=4==e,p=6==e,f=7==e,d=5==e||p;return function(h,v,g,m){for(var y,b,w=a(h),x=o(w),_=r(v,g,3),k=i(x),S=0,C=m||s,O=t?C(h,k):n||f?C(h,0):void 0;k>S;S++)if((d||S in x)&&(b=_(y=x[S],S,w),e))if(t)O[S]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return S;case 2:l.call(O,y)}else switch(e){case 4:return!1;case 7:l.call(O,y)}return p?-1:c||u?u:O}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterReject:c(7)}},function(e,t,n){"use strict";var r=n(1),o=n(11),a=n(3),i=n(13),s=n(6),l=n(10),c=n(14).f,u=n(154),p=a.Symbol;if(o&&s(p)&&(!("description"in p.prototype)||void 0!==p().description)){var f={},d=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),t=this instanceof d?new p(e):void 0===e?p():p(e);return""===e&&(f[t]=!0),t};u(d,p);var h=d.prototype=p.prototype;h.constructor=d;var v=h.toString,g="Symbol(test)"==String(p("test")),m=/^Symbol\((.*)\)[^)]+$/;c(h,"description",{configurable:!0,get:function(){var e=l(this)?this.valueOf():this,t=v.call(e);if(i(f,e))return"";var n=g?t.slice(7,-1):t.replace(m,"$1");return""===n?void 0:n}}),r({global:!0,forced:!0},{Symbol:d})}},function(e,t,n){var r=n(28).Symbol;e.exports=r},function(e,t,n){var r=n(67),o=n(281),a=n(282),i=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":i&&i in Object(e)?o(e):a(e)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));n(105);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"c",(function(){return a})),n.d(t,"b",(function(){return i}));n(21),n(57),n(210);var r=n(27);function o(e,t){return e=e.filter((function(n,r){var o=n.title,a=n.frontmatter,i=a.home,s=a.date,l=a.publish;if(e.indexOf(n)!==r)return!1;var c=!0===i||null==o||!1===l;return!0===t?!(c||void 0===s):!c}))}function a(e){e.sort((function(e,t){var n=e.frontmatter.sticky,o=t.frontmatter.sticky;return n&&o?n==o?Object(r.c)(e,t):n-o:n&&!o?-1:!n&&o?1:Object(r.c)(e,t)}))}function i(e){e.sort((function(e,t){return Object(r.c)(e,t)}))}},function(e,t,n){"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:"tomorrow",t=["tomorrow","funky","okaidia","solarizedlight","default"],n="//prismjs.com/themes/prism".concat(t.indexOf(e)>-1?"-".concat(e):"",".css");Object(r.a)(n)}function i(e){var t=e.__proto__.push;e.__proto__.push=function(e){return t.call(this,e).catch((function(e){return e}))}}function s(e){e.beforeEach((function(e,t,n){var r=decodeURIComponent(e.path);r!==e.path?n(Object.assign({},e,{fullPath:decodeURIComponent(e.fullPath),path:r})):n()}))}},function(e,t,n){var r=n(1),o=n(15),a=n(83);r({target:"Object",stat:!0,forced:n(2)((function(){a(1)}))},{keys:function(e){return a(o(e))}})},function(e,t,n){var r=n(11),o=n(13),a=Function.prototype,i=r&&Object.getOwnPropertyDescriptor,s=o(a,"name"),l=s&&"something"===function(){}.name,c=s&&(!r||r&&i(a,"name").configurable);e.exports={EXISTS:s,PROPER:l,CONFIGURABLE:c}},function(e,t,n){"use strict";var r=n(81),o=n(14),a=n(63);e.exports=function(e,t,n){var i=r(t);i in e?o.f(e,i,a(0,n)):e[i]=n}},function(e,t,n){var r=n(2),o=n(4),a=n(46),i=o("species");e.exports=function(e){return a>=51||!r((function(){var t=[];return(t.constructor={})[i]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},function(e,t,n){var r=n(38),o=n(107);(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.18.2",mode:r?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++n+r).toString(36)}},function(e,t,n){var r=n(3),o=n(10),a=r.document,i=o(a)&&o(a.createElement);e.exports=function(e){return i?a.createElement(e):{}}},function(e,t,n){var r=n(110),o=n(82);e.exports=function(e){var t=r(e,"string");return o(t)?t:String(t)}},function(e,t,n){var r=n(6),o=n(23),a=n(147);e.exports=a?function(e){return"symbol"==typeof e}:function(e){var t=o("Symbol");return r(t)&&Object(e)instanceof t}},function(e,t,n){var r=n(151),o=n(112);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t,n){var r=n(78),o=n(79),a=r("keys");e.exports=function(e){return a[e]||(a[e]=o(e))}},function(e,t,n){var r=n(6),o=n(107),a=Function.toString;r(o.inspectSource)||(o.inspectSource=function(e){return a.call(e)}),e.exports=o.inspectSource},function(e,t,n){var r=n(2),o=n(6),a=/#|\.prototype\./,i=function(e,t){var n=l[s(e)];return n==u||n!=c&&(o(t)?r(t):!!t)},s=i.normalize=function(e){return String(e).replace(a,".").toLowerCase()},l=i.data={},c=i.NATIVE="N",u=i.POLYFILL="P";e.exports=i},function(e,t,n){var r=n(14).f,o=n(13),a=n(4)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,a)&&r(e,a,{configurable:!0,value:t})}},function(e,t,n){var r=n(9),o=n(252);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,a){return r(n),o(a),t?e.call(n,a):n.__proto__=a,n}}():void 0)},function(e,t,n){var r=n(33);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var r=n(117),o=n(6),a=n(45),i=n(4)("toStringTag"),s="Arguments"==a(function(){return arguments}());e.exports=r?a:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),i))?n:s?a(t):"Object"==(r=a(t))&&o(t.callee)?"Arguments":r}},function(e,t,n){var r=n(2),o=n(6),a=n(90),i=n(23),s=n(85),l=[],c=i("Reflect","construct"),u=/^\s*(?:class|function)\b/,p=u.exec,f=!u.exec((function(){})),d=function(e){if(!o(e))return!1;try{return c(Object,l,e),!0}catch(e){return!1}};e.exports=!c||r((function(){var e;return d(d.call)||!d(Object)||!d((function(){e=!0}))||e}))?function(e){if(!o(e))return!1;switch(a(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}return f||!!p.call(u,s(e))}:d},function(e,t,n){var r=n(45),o=n(3);e.exports="process"==r(o.process)},function(e,t,n){n(182)("iterator")},function(e,t,n){n(1)({target:"Array",stat:!0},{isArray:n(64)})},function(e,t,n){"use strict";var r,o,a=n(12),i=n(120),s=n(121),l=n(78),c=n(39),u=n(40).get,p=n(185),f=n(186),d=RegExp.prototype.exec,h=l("native-string-replace",String.prototype.replace),v=d,g=(r=/a/,o=/b*/g,d.call(r,"a"),d.call(o,"a"),0!==r.lastIndex||0!==o.lastIndex),m=s.UNSUPPORTED_Y||s.BROKEN_CARET,y=void 0!==/()??/.exec("")[1];(g||y||m||p||f)&&(v=function(e){var t,n,r,o,s,l,p,f=this,b=u(f),w=a(e),x=b.raw;if(x)return x.lastIndex=f.lastIndex,t=v.call(x,w),f.lastIndex=x.lastIndex,t;var _=b.groups,k=m&&f.sticky,S=i.call(f),C=f.source,O=0,T=w;if(k&&(-1===(S=S.replace("y","")).indexOf("g")&&(S+="g"),T=w.slice(f.lastIndex),f.lastIndex>0&&(!f.multiline||f.multiline&&"\n"!==w.charAt(f.lastIndex-1))&&(C="(?: "+C+")",T=" "+T,O++),n=new RegExp("^(?:"+C+")",S)),y&&(n=new RegExp("^"+C+"$(?!\\s)",S)),g&&(r=f.lastIndex),o=d.call(k?n:f,T),k?o?(o.input=o.input.slice(O),o[0]=o[0].slice(O),o.index=f.lastIndex,f.lastIndex+=o[0].length):f.lastIndex=0:g&&o&&(f.lastIndex=f.global?o.index+o[0].length:r),y&&o&&o.length>1&&h.call(o[0],n,(function(){for(s=1;s
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var l=n.render(!t),c=l.querySelector(r.barSelector),u=r.speed,p=r.easing;return l.offsetWidth,i((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,function(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}(e,u,p)),1===e?(s(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout((function(){s(l,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),l=e?"-100":a(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var i=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()})),t[n]||(t[n]=function(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}(n))}function r(e,t,r){t=n(t),e.style[t]=r}return function(e,t){var n,o,a=arguments;if(2==a.length)for(n in t)void 0!==(o=t[n])&&t.hasOwnProperty(n)&&r(e,n,o);else r(e,a[1],a[2])}}();function l(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;l(n,t)||(e.className=r.substring(1))}function u(e,t){var n,r=p(e);l(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n})?r.call(t,n,t,e):r)||(e.exports=o)},function(e,t,n){"use strict";var r=n(1),o=n(2),a=n(64),i=n(10),s=n(15),l=n(31),c=n(76),u=n(139),p=n(77),f=n(4),d=n(46),h=f("isConcatSpreadable"),v=d>=51||!o((function(){var e=[];return e[h]=!1,e.concat()[0]!==e})),g=p("concat"),m=function(e){if(!i(e))return!1;var t=e[h];return void 0!==t?!!t:a(e)};r({target:"Array",proto:!0,forced:!v||!g},{concat:function(e){var t,n,r,o,a,i=s(this),p=u(i,0),f=0;for(t=-1,r=arguments.length;t9007199254740991)throw TypeError("Maximum allowed index exceeded");for(n=0;n=9007199254740991)throw TypeError("Maximum allowed index exceeded");c(p,f++,a)}return p.length=f,p}})},function(e,t,n){"use strict";var r=n(1),o=n(65).some;r({target:"Array",proto:!0,forced:!n(50)("some")},{some:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(1),o=n(11);r({target:"Object",stat:!0,forced:!o,sham:!o},{defineProperty:n(14).f})},function(e,t,n){var r=n(11),o=n(75).EXISTS,a=n(14).f,i=Function.prototype,s=i.toString,l=/^\s*function ([^ (]*)/;r&&!o&&a(i,"name",{configurable:!0,get:function(){try{return s.call(this).match(l)[1]}catch(e){return""}}})},function(e,t,n){var r=n(3),o=n(108),a=r["__core-js_shared__"]||o("__core-js_shared__",{});e.exports=a},function(e,t,n){var r=n(3);e.exports=function(e,t){try{Object.defineProperty(r,e,{value:t,configurable:!0,writable:!0})}catch(n){r[e]=t}return t}},function(e,t,n){var r=n(46),o=n(2);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(e,t,n){var r=n(10),o=n(82),a=n(47),i=n(249),s=n(4)("toPrimitive");e.exports=function(e,t){if(!r(e)||o(e))return e;var n,l=a(e,s);if(l){if(void 0===t&&(t="default"),n=l.call(e,t),!r(n)||o(n))return n;throw TypeError("Can't convert object to primitive value")}return void 0===t&&(t="number"),i(e,t)}},function(e,t,n){var r=n(22),o=n(138),a=n(31),i=function(e){return function(t,n,i){var s,l=r(t),c=a(l),u=o(i,c);if(e&&n!=n){for(;c>u;)if((s=l[u++])!=s)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},function(e,t){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,t,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,a=o&&!r.call({1:2},1);t.f=a?function(e){var t=o(this,e);return!!t&&t.enumerable}:r},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var r=n(13),o=n(6),a=n(15),i=n(84),s=n(157),l=i("IE_PROTO"),c=Object.prototype;e.exports=s?Object.getPrototypeOf:function(e){var t=a(e);if(r(t,l))return t[l];var n=t.constructor;return o(n)&&t instanceof n?n.prototype:t instanceof Object?c:null}},function(e,t,n){var r=n(90),o=n(47),a=n(62),i=n(4)("iterator");e.exports=function(e){if(null!=e)return o(e,i)||o(e,"@@iterator")||a[r(e)]}},function(e,t,n){var r={};r[n(4)("toStringTag")]="z",e.exports="[object z]"===String(r)},function(e,t,n){var r=n(9),o=n(164),a=n(4)("species");e.exports=function(e,t){var n,i=r(e).constructor;return void 0===i||null==(n=r(i)[a])?t:o(n)}},function(e,t,n){var r=n(10),o=n(45),a=n(4)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[a])?!!t:"RegExp"==o(e))}},function(e,t,n){"use strict";var r=n(9);e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,n){var r=n(2),o=n(3).RegExp;t.UNSUPPORTED_Y=r((function(){var e=o("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),t.BROKEN_CARET=r((function(){var e=o("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},function(e,t,n){"use strict";n(37);var r=n(16),o=n(95),a=n(2),i=n(4),s=n(34),l=i("species"),c=RegExp.prototype;e.exports=function(e,t,n,u){var p=i(e),f=!a((function(){var t={};return t[p]=function(){return 7},7!=""[e](t)})),d=f&&!a((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[l]=function(){return n},n.flags="",n[p]=/./[p]),n.exec=function(){return t=!0,null},n[p](""),!t}));if(!f||!d||n){var h=/./[p],v=t(p,""[e],(function(e,t,n,r,a){var i=t.exec;return i===o||i===c.exec?f&&!a?{done:!0,value:h.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}));r(String.prototype,e,v[0]),r(c,p,v[1])}u&&s(c[p],"sham",!0)}},function(e,t,n){"use strict";var r=n(170).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},function(e,t,n){var r=n(9),o=n(6),a=n(45),i=n(95);e.exports=function(e,t){var n=e.exec;if(o(n)){var s=n.call(e,t);return null!==s&&r(s),s}if("RegExp"===a(e))return i.call(e,t);throw TypeError("RegExp#exec called on incompatible receiver")}},function(e,t,n){var r=n(280),o=n(54),a=Object.prototype,i=a.hasOwnProperty,s=a.propertyIsEnumerable,l=r(function(){return arguments}())?r:function(e){return o(e)&&i.call(e,"callee")&&!s.call(e,"callee")};e.exports=l},function(e,t,n){var r=n(41)(n(28),"Map");e.exports=r},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){var r=n(300),o=n(307),a=n(309),i=n(310),s=n(311);function l(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e<=9007199254740991}},function(e,t,n){var r=n(29),o=n(132),a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,i=/^\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!o(e))||(i.test(e)||!a.test(e)||null!=t&&e in Object(t))}},function(e,t,n){var r=n(68),o=n(54);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},function(e,t){e.exports=function(e){return e}},function(e,t,n){var r=n(403);e.exports=function(e){return r(e,{weekStartsOn:1})}},function(e,t,n){"use strict";var r=n(17),o=n(415),a=n(222),i={"Content-Type":"application/x-www-form-urlencoded"};function s(e,t){!r.isUndefined(e)&&r.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var l,c={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:(("undefined"!=typeof XMLHttpRequest||"undefined"!=typeof process&&"[object process]"===Object.prototype.toString.call(process))&&(l=n(223)),l),transformRequest:[function(e,t){return o(t,"Accept"),o(t,"Content-Type"),r.isFormData(e)||r.isArrayBuffer(e)||r.isBuffer(e)||r.isStream(e)||r.isFile(e)||r.isBlob(e)?e:r.isArrayBufferView(e)?e.buffer:r.isURLSearchParams(e)?(s(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):r.isObject(e)||t&&"application/json"===t["Content-Type"]?(s(t,"application/json"),function(e,t,n){if(r.isString(e))try{return(t||JSON.parse)(e),r.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional,n=t&&t.silentJSONParsing,o=t&&t.forcedJSONParsing,i=!n&&"json"===this.responseType;if(i||o&&r.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(i){if("SyntaxError"===e.name)throw a(e,this,"E_JSON_PARSE");throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300}};c.headers={common:{Accept:"application/json, text/plain, */*"}},r.forEach(["delete","get","head"],(function(e){c.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){c.headers[e]=r.merge(i)})),e.exports=c},function(e,t,n){"use strict";n.d(t,"a",(function(){return oe})),n.d(t,"b",(function(){return fe})),n.d(t,"c",(function(){return j})),n.d(t,"e",(function(){return ne})),n.d(t,"f",(function(){return re})),n.d(t,"g",(function(){return ee})),n.d(t,"h",(function(){return q})),n.d(t,"i",(function(){return H})),n.d(t,"d",(function(){return he}));var r=n(0);function o(e){return"function"==typeof e&&/native code/.test(e.toString())}var a="undefined"!=typeof Symbol&&o(Symbol)&&"undefined"!=typeof Reflect&&o(Reflect.ownKeys),i=function(e){return e};function s(e,t,n){var r=n.get,o=n.set;Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:r||i,set:o||i})}function l(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function c(e,t){return Object.hasOwnProperty.call(e,t)}function u(e){return Array.isArray(e)}Object.prototype.toString;function p(e){return null!==e&&"object"==typeof e}function f(e){return"[object Object]"===function(e){return Object.prototype.toString.call(e)}(e)}function d(e){return"function"==typeof e} +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +var h=function(e,t){return(h=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};var v;function g(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function m(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,a=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i}function y(e,t){for(var n=0,r=t.length,o=e.length;n=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values"),a.Arguments=a.Array,o("keys"),o("values"),o("entries")},function(e,t,n){var r=n(4),o=n(39),a=n(14),i=r("unscopables"),s=Array.prototype;null==s[i]&&a.f(s,i,{configurable:!0,value:o(null)}),e.exports=function(e){s[i][e]=!0}},function(e,t,n){var r=n(109);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(e,t,n){var r=n(11),o=n(14),a=n(9),i=n(83);e.exports=r?Object.defineProperties:function(e,t){a(e);for(var n,r=i(t),s=r.length,l=0;s>l;)o.f(e,n=r[l++],t[n]);return e}},function(e,t,n){var r=n(11),o=n(2),a=n(80);e.exports=!r&&!o((function(){return 7!=Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a}))},function(e,t){e.exports=function(e){try{return String(e)}catch(e){return"Object"}}},function(e,t,n){var r=n(13),o=n(22),a=n(111).indexOf,i=n(61);e.exports=function(e,t){var n,s=o(e),l=0,c=[];for(n in s)!r(i,n)&&r(s,n)&&c.push(n);for(;t.length>l;)r(s,n=t[l++])&&(~a(c,n)||c.push(n));return c}},function(e,t,n){var r=n(23);e.exports=r("document","documentElement")},function(e,t,n){"use strict";var r=n(1),o=n(38),a=n(75),i=n(6),s=n(251),l=n(115),c=n(88),u=n(87),p=n(34),f=n(16),d=n(4),h=n(62),v=n(156),g=a.PROPER,m=a.CONFIGURABLE,y=v.IteratorPrototype,b=v.BUGGY_SAFARI_ITERATORS,w=d("iterator"),x=function(){return this};e.exports=function(e,t,n,a,d,v,_){s(n,t,a);var k,S,C,O=function(e){if(e===d&&P)return P;if(!b&&e in $)return $[e];switch(e){case"keys":case"values":case"entries":return function(){return new n(this,e)}}return function(){return new n(this)}},T=t+" Iterator",A=!1,$=e.prototype,j=$[w]||$["@@iterator"]||d&&$[d],P=!b&&j||O(d),E="Array"==t&&$.entries||j;if(E&&(k=l(E.call(new e)))!==Object.prototype&&k.next&&(o||l(k)===y||(c?c(k,y):i(k[w])||f(k,w,x)),u(k,T,!0,!0),o&&(h[T]=x)),g&&"values"==d&&j&&"values"!==j.name&&(!o&&m?p($,"name","values"):(A=!0,P=function(){return j.call(this)})),d)if(S={values:O("values"),keys:v?P:O("keys"),entries:O("entries")},_)for(C in S)(b||A||!(C in $))&&f($,C,S[C]);else r({target:t,proto:!0,forced:b||A},S);return o&&!_||$[w]===P||f($,w,P,{name:d}),h[t]=P,S}},function(e,t,n){var r=n(13),o=n(155),a=n(35),i=n(14);e.exports=function(e,t){for(var n=o(t),s=i.f,l=a.f,c=0;cr;)t.push(arguments[r++]);return x[++w]=function(){(l(e)?e:Function(e)).apply(void 0,t)},o(w),w},g=function(e){delete x[e]},h?o=function(e){m.nextTick(k(e))}:b&&b.now?o=function(e){b.now(k(e))}:y&&!d?(i=(a=new y).port2,a.port1.onmessage=S,o=u(i.postMessage,i,1)):s.addEventListener&&l(s.postMessage)&&!s.importScripts&&r&&"file:"!==r.protocol&&!c(C)?(o=C,s.addEventListener("message",S,!1)):o="onreadystatechange"in f("script")?function(e){p.appendChild(f("script")).onreadystatechange=function(){p.removeChild(this),_(e)}}:function(e){setTimeout(k(e),0)}),e.exports={set:v,clear:g}},function(e,t,n){var r=n(32);e.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(r)},function(e,t,n){var r=n(9),o=n(10),a=n(168);e.exports=function(e,t){if(r(e),o(t)&&t.constructor===e)return t;var n=a.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){"use strict";var r=n(33),o=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new o(e)}},function(e,t,n){var r=function(e){"use strict";var t=Object.prototype,n=t.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},o=r.iterator||"@@iterator",a=r.asyncIterator||"@@asyncIterator",i=r.toStringTag||"@@toStringTag";function s(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{s({},"")}catch(e){s=function(e,t,n){return e[t]=n}}function l(e,t,n,r){var o=t&&t.prototype instanceof p?t:p,a=Object.create(o.prototype),i=new k(r||[]);return a._invoke=function(e,t,n){var r="suspendedStart";return function(o,a){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===o)throw a;return C()}for(n.method=o,n.arg=a;;){var i=n.delegate;if(i){var s=w(i,n);if(s){if(s===u)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var l=c(e,t,n);if("normal"===l.type){if(r=n.done?"completed":"suspendedYield",l.arg===u)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(r="completed",n.method="throw",n.arg=l.arg)}}}(e,n,i),a}function c(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=l;var u={};function p(){}function f(){}function d(){}var h={};s(h,o,(function(){return this}));var v=Object.getPrototypeOf,g=v&&v(v(S([])));g&&g!==t&&n.call(g,o)&&(h=g);var m=d.prototype=p.prototype=Object.create(h);function y(e){["next","throw","return"].forEach((function(t){s(e,t,(function(e){return this._invoke(t,e)}))}))}function b(e,t){var r;this._invoke=function(o,a){function i(){return new t((function(r,i){!function r(o,a,i,s){var l=c(e[o],e,a);if("throw"!==l.type){var u=l.arg,p=u.value;return p&&"object"==typeof p&&n.call(p,"__await")?t.resolve(p.__await).then((function(e){r("next",e,i,s)}),(function(e){r("throw",e,i,s)})):t.resolve(p).then((function(e){u.value=e,i(u)}),(function(e){return r("throw",e,i,s)}))}s(l.arg)}(o,a,r,i)}))}return r=r?r.then(i,i):i()}}function w(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,w(e,t),"throw"===t.method))return u;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return u}var r=c(n,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,u;var o=r.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,u):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,u)}function x(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function _(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function k(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(x,this),this.reset(!0)}function S(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,a=function t(){for(;++r=0;--o){var a=this.tryEntries[o],i=a.completion;if("root"===a.tryLoc)return r("end");if(a.tryLoc<=this.prev){var s=n.call(a,"catchLoc"),l=n.call(a,"finallyLoc");if(s&&l){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),_(n),u}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;_(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:S(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),u}},e}(e.exports);try{regeneratorRuntime=r}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}},function(e,t,n){var r=n(59),o=n(12),a=n(19),i=function(e){return function(t,n){var i,s,l=o(a(t)),c=r(n),u=l.length;return c<0||c>=u?e?"":void 0:(i=l.charCodeAt(c))<55296||i>56319||c+1===u||(s=l.charCodeAt(c+1))<56320||s>57343?e?l.charAt(c):i:e?l.slice(c,c+2):s-56320+(i-55296<<10)+65536}};e.exports={codeAt:i(!1),charAt:i(!0)}},function(e,t){e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(e,t,n){var r=n(80)("span").classList,o=r&&r.constructor&&r.constructor.prototype;e.exports=o===Object.prototype?void 0:o},function(e,t,n){var r=n(1),o=n(11),a=n(155),i=n(22),s=n(35),l=n(76);r({target:"Object",stat:!0,sham:!o},{getOwnPropertyDescriptors:function(e){for(var t,n,r=i(e),o=s.f,c=a(r),u={},p=0;c.length>p;)void 0!==(n=o(r,t=c[p++]))&&l(u,t,n);return u}})},function(e,t,n){var r=n(1),o=n(2),a=n(15),i=n(115),s=n(157);r({target:"Object",stat:!0,forced:o((function(){i(1)})),sham:!s},{getPrototypeOf:function(e){return i(a(e))}})},function(e,t,n){"use strict";var r=n(1),o=n(268).left,a=n(50),i=n(46),s=n(92);r({target:"Array",proto:!0,forced:!a("reduce")||!s&&i>79&&i<83},{reduce:function(e){return o(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(119);e.exports=function(e){if(r(e))throw TypeError("The method doesn't accept regular expressions");return e}},function(e,t,n){var r=n(4)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[r]=!1,"/./"[e](t)}catch(e){}}return!1}},function(e,t,n){"use strict";var r=n(65).forEach,o=n(50)("forEach");e.exports=o?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},function(e,t,n){var r=n(2);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(e,t,n){var r=n(22),o=n(49).f,a={}.toString,i="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return i&&"[object Window]"==a.call(e)?function(e){try{return o(e)}catch(e){return i.slice()}}(e):o(r(e))}},function(e,t,n){var r=n(4);t.f=r},function(e,t,n){var r=n(272),o=n(13),a=n(181),i=n(14).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||i(t,e,{value:a.f(e)})}},function(e,t,n){var r=n(1),o=n(273);r({target:"Array",stat:!0,forced:!n(163)((function(e){Array.from(e)}))},{from:o})},function(e,t,n){n(1)({target:"Object",stat:!0,sham:!n(11)},{create:n(39)})},function(e,t,n){var r=n(2),o=n(3).RegExp;e.exports=r((function(){var e=o(".","s");return!(e.dotAll&&e.exec("\n")&&"s"===e.flags)}))},function(e,t,n){var r=n(2),o=n(3).RegExp;e.exports=r((function(){var e=o("(?
b)","g");return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$c")}))},function(e,t,n){"use strict";var r=n(1),o=n(60),a=n(22),i=n(50),s=[].join,l=o!=Object,c=i("join",",");r({target:"Array",proto:!0,forced:l||!c},{join:function(e){return s.call(a(this),void 0===e?",":e)}})},function(e,t){e.exports=function(e,t){for(var n=-1,r=t.length,o=e.length;++nu))return!1;var f=l.get(e),d=l.get(t);if(f&&d)return f==t&&d==e;var h=-1,v=!0,g=2&n?new r:void 0;for(l.set(e,t),l.set(t,e);++h-1&&e%1==0&&e3)){if(f)return!0;if(h)return h<603;var e,t,n,r,o="";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)v.push({k:t+r,v:n})}for(v.sort((function(e,t){return t.v-e.v})),r=0;rs(n)?1:-1}}(e))).length,r=0;r1;){var t=e.pop(),n=t.obj[t.prop];if(o(n)){for(var r=[],a=0;a=48&&s<=57||s>=65&&s<=90||s>=97&&s<=122?o+=r.charAt(i):s<128?o+=a[s]:s<2048?o+=a[192|s>>6]+a[128|63&s]:s<55296||s>=57344?o+=a[224|s>>12]+a[128|s>>6&63]+a[128|63&s]:(i+=1,s=65536+((1023&s)<<10|1023&r.charCodeAt(i)),o+=a[240|s>>18]+a[128|s>>12&63]+a[128|s>>6&63]+a[128|63&s])}return o},isBuffer:function(e){return!(!e||"object"!=typeof e)&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))},isRegExp:function(e){return"[object RegExp]"===Object.prototype.toString.call(e)},merge:function e(t,n,a){if(!n)return t;if("object"!=typeof n){if(o(t))t.push(n);else{if(!t||"object"!=typeof t)return[t,n];(a&&(a.plainObjects||a.allowPrototypes)||!r.call(Object.prototype,n))&&(t[n]=!0)}return t}if(!t||"object"!=typeof t)return[t].concat(n);var s=t;return o(t)&&!o(n)&&(s=i(t,a)),o(t)&&o(n)?(n.forEach((function(n,o){if(r.call(t,o)){var i=t[o];i&&"object"==typeof i&&n&&"object"==typeof n?t[o]=e(i,n,a):t.push(n)}else t[o]=n})),t):Object.keys(n).reduce((function(t,o){var i=n[o];return r.call(t,o)?t[o]=e(t[o],i,a):t[o]=i,t}),s)}}},function(e,t,n){"use strict";var r=String.prototype.replace,o=/%20/g;e.exports={default:"RFC3986",formatters:{RFC1738:function(e){return r.call(e,o,"+")},RFC3986:function(e){return e}},RFC1738:"RFC1738",RFC3986:"RFC3986"}},function(e,t){e.exports=function(e){return e instanceof Date}},function(e,t,n){var r=n(42),o=n(134);e.exports=function(e){var t=r(e),n=t.getFullYear(),a=new Date(0);a.setFullYear(n+1,0,4),a.setHours(0,0,0,0);var i=o(a),s=new Date(0);s.setFullYear(n,0,4),s.setHours(0,0,0,0);var l=o(s);return t.getTime()>=i.getTime()?n+1:t.getTime()>=l.getTime()?n:n-1}},function(e,t,n){"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),r=0;r=t?e:""+Array(t+1-r.length).join(n)+e},m={s:g,z:function(e){var t=-e.utcOffset(),n=Math.abs(t),r=Math.floor(n/60),o=n%60;return(t<=0?"+":"-")+g(r,2,"0")+":"+g(o,2,"0")},m:function e(t,n){if(t.date()=t||n<0||g&&e-c>=a}function x(){var e=d();if(w(e))return _(e);s=setTimeout(x,function(e){var n=t-(e-l);return g?f(n,a-(e-c)):n}(e))}function _(e){return s=void 0,m&&r?y(e):(r=o=void 0,i)}function k(){var e=d(),n=w(e);if(r=arguments,o=this,l=e,n){if(void 0===s)return b(l);if(g)return s=setTimeout(x,t),y(l)}return void 0===s&&(s=setTimeout(x,t)),i}return t=v(t)||0,h(n)&&(u=!!n.leading,a=(g="maxWait"in n)?p(v(n.maxWait)||0,t):a,m="trailing"in n?!!n.trailing:m),k.cancel=function(){void 0!==s&&clearTimeout(s),c=0,r=l=o=s=void 0},k.flush=function(){return void 0===s?i:_(d())},k}},function(e,t,n){!function(){"use strict";e.exports={polyfill:function(){var e=window,t=document;if(!("scrollBehavior"in t.documentElement.style)||!0===e.__forceSmoothScrollPolyfill__){var n,r=e.HTMLElement||e.Element,o={scroll:e.scroll||e.scrollTo,scrollBy:e.scrollBy,elementScroll:r.prototype.scroll||s,scrollIntoView:r.prototype.scrollIntoView},a=e.performance&&e.performance.now?e.performance.now.bind(e.performance):Date.now,i=(n=e.navigator.userAgent,new RegExp(["MSIE ","Trident/","Edge/"].join("|")).test(n)?1:0);e.scroll=e.scrollTo=function(){void 0!==arguments[0]&&(!0!==l(arguments[0])?h.call(e,t.body,void 0!==arguments[0].left?~~arguments[0].left:e.scrollX||e.pageXOffset,void 0!==arguments[0].top?~~arguments[0].top:e.scrollY||e.pageYOffset):o.scroll.call(e,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:e.scrollX||e.pageXOffset,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:e.scrollY||e.pageYOffset))},e.scrollBy=function(){void 0!==arguments[0]&&(l(arguments[0])?o.scrollBy.call(e,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:0,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:0):h.call(e,t.body,~~arguments[0].left+(e.scrollX||e.pageXOffset),~~arguments[0].top+(e.scrollY||e.pageYOffset)))},r.prototype.scroll=r.prototype.scrollTo=function(){if(void 0!==arguments[0])if(!0!==l(arguments[0])){var e=arguments[0].left,t=arguments[0].top;h.call(this,this,void 0===e?this.scrollLeft:~~e,void 0===t?this.scrollTop:~~t)}else{if("number"==typeof arguments[0]&&void 0===arguments[1])throw new SyntaxError("Value could not be converted");o.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left:"object"!=typeof arguments[0]?~~arguments[0]:this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top:void 0!==arguments[1]?~~arguments[1]:this.scrollTop)}},r.prototype.scrollBy=function(){void 0!==arguments[0]&&(!0!==l(arguments[0])?this.scroll({left:~~arguments[0].left+this.scrollLeft,top:~~arguments[0].top+this.scrollTop,behavior:arguments[0].behavior}):o.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left+this.scrollLeft:~~arguments[0]+this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top+this.scrollTop:~~arguments[1]+this.scrollTop))},r.prototype.scrollIntoView=function(){if(!0!==l(arguments[0])){var n=f(this),r=n.getBoundingClientRect(),a=this.getBoundingClientRect();n!==t.body?(h.call(this,n,n.scrollLeft+a.left-r.left,n.scrollTop+a.top-r.top),"fixed"!==e.getComputedStyle(n).position&&e.scrollBy({left:r.left,top:r.top,behavior:"smooth"})):e.scrollBy({left:a.left,top:a.top,behavior:"smooth"})}else o.scrollIntoView.call(this,void 0===arguments[0]||arguments[0])}}function s(e,t){this.scrollLeft=e,this.scrollTop=t}function l(e){if(null===e||"object"!=typeof e||void 0===e.behavior||"auto"===e.behavior||"instant"===e.behavior)return!0;if("object"==typeof e&&"smooth"===e.behavior)return!1;throw new TypeError("behavior member of ScrollOptions "+e.behavior+" is not a valid value for enumeration ScrollBehavior.")}function c(e,t){return"Y"===t?e.clientHeight+i1?1:s,n=.5*(1-Math.cos(Math.PI*i)),r=t.startX+(t.x-t.startX)*n,o=t.startY+(t.y-t.startY)*n,t.method.call(t.scrollable,r,o),r===t.x&&o===t.y||e.requestAnimationFrame(d.bind(e,t))}function h(n,r,i){var l,c,u,p,f=a();n===t.body?(l=e,c=e.scrollX||e.pageXOffset,u=e.scrollY||e.pageYOffset,p=o.scroll):(l=n,c=n.scrollLeft,u=n.scrollTop,p=s),d({scrollable:l,method:p,startTime:f,startX:c,startY:u,x:r,y:i})}}}}()},function(e,t,n){var r=n(397),o=n(402),a=n(219),i=n(42),s=n(405),l=n(406);var c={M:function(e){return e.getMonth()+1},MM:function(e){return f(e.getMonth()+1,2)},Q:function(e){return Math.ceil((e.getMonth()+1)/3)},D:function(e){return e.getDate()},DD:function(e){return f(e.getDate(),2)},DDD:function(e){return r(e)},DDDD:function(e){return f(r(e),3)},d:function(e){return e.getDay()},E:function(e){return e.getDay()||7},W:function(e){return o(e)},WW:function(e){return f(o(e),2)},YY:function(e){return f(e.getFullYear(),4).substr(2)},YYYY:function(e){return f(e.getFullYear(),4)},GG:function(e){return String(a(e)).substr(2)},GGGG:function(e){return a(e)},H:function(e){return e.getHours()},HH:function(e){return f(e.getHours(),2)},h:function(e){var t=e.getHours();return 0===t?12:t>12?t%12:t},hh:function(e){return f(c.h(e),2)},m:function(e){return e.getMinutes()},mm:function(e){return f(e.getMinutes(),2)},s:function(e){return e.getSeconds()},ss:function(e){return f(e.getSeconds(),2)},S:function(e){return Math.floor(e.getMilliseconds()/100)},SS:function(e){return f(Math.floor(e.getMilliseconds()/10),2)},SSS:function(e){return f(e.getMilliseconds(),3)},Z:function(e){return p(e.getTimezoneOffset(),":")},ZZ:function(e){return p(e.getTimezoneOffset())},X:function(e){return Math.floor(e.getTime()/1e3)},x:function(e){return e.getTime()}};function u(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|]$/g,""):e.replace(/\\/g,"")}function p(e,t){t=t||"";var n=e>0?"-":"+",r=Math.abs(e),o=r%60;return n+f(Math.floor(r/60),2)+t+f(o,2)}function f(e,t){for(var n=Math.abs(e).toString();n.length{"%%"!==e&&(r++,"%c"===e&&(o=r))}),t.splice(o,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=n(431)(t);const{formatters:r}=e.exports;r.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},function(e,t,n){function r(t){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?(e.exports=r=function(e){return typeof e},e.exports.default=e.exports,e.exports.__esModule=!0):(e.exports=r=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.default=e.exports,e.exports.__esModule=!0),r(t)}n(53),n(66),n(18),n(93),n(24),n(26),e.exports=r,e.exports.default=e.exports,e.exports.__esModule=!0},function(e,t,n){var r=n(1),o=n(2),a=n(22),i=n(35).f,s=n(11),l=o((function(){i(1)}));r({target:"Object",stat:!0,forced:!s||l,sham:!s},{getOwnPropertyDescriptor:function(e,t){return i(a(e),t)}})},function(e,t,n){"use strict";var r=n(1),o=n(2),a=n(15),i=n(110);r({target:"Date",proto:!0,forced:o((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}))},{toJSON:function(e){var t=a(this),n=i(t,"number");return"number"!=typeof n||isFinite(n)?t.toISOString():null}})},function(e,t,n){"use strict";n(1)({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})},function(e,t,n){var r=n(1),o=n(378);r({target:"Date",proto:!0,forced:Date.prototype.toISOString!==o},{toISOString:o})},function(e,t,n){"use strict";var r=n(122),o=n(9),a=n(48),i=n(12),s=n(19),l=n(47),c=n(123),u=n(124);r("match",(function(e,t,n){return[function(t){var n=s(this),r=null==t?void 0:l(t,e);return r?r.call(t,n):new RegExp(t)[e](i(n))},function(e){var r=o(this),s=i(e),l=n(t,r,s);if(l.done)return l.value;if(!r.global)return u(r,s);var p=r.unicode;r.lastIndex=0;for(var f,d=[],h=0;null!==(f=u(r,s));){var v=i(f[0]);d[h]=v,""===v&&(r.lastIndex=c(s,a(r.lastIndex),p)),h++}return 0===h?null:d}]}))},function(e,t,n){var r=n(11),o=n(3),a=n(86),i=n(211),s=n(34),l=n(14).f,c=n(49).f,u=n(119),p=n(12),f=n(120),d=n(121),h=n(16),v=n(2),g=n(13),m=n(40).enforce,y=n(159),b=n(4),w=n(185),x=n(186),_=b("match"),k=o.RegExp,S=k.prototype,C=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,O=/a/g,T=/a/g,A=new k(O)!==O,$=d.UNSUPPORTED_Y,j=r&&(!A||$||w||x||v((function(){return T[_]=!1,k(O)!=O||k(T)==T||"/a/i"!=k(O,"i")})));if(a("RegExp",j)){for(var P=function(e,t){var n,r,o,a,l,c,d=this instanceof P,h=u(e),v=void 0===t,y=[],b=e;if(!d&&h&&v&&e.constructor===P)return e;if((h||e instanceof P)&&(e=e.source,v&&(t="flags"in b?b.flags:f.call(b))),e=void 0===e?"":p(e),t=void 0===t?"":p(t),b=e,w&&"dotAll"in O&&(r=!!t&&t.indexOf("s")>-1)&&(t=t.replace(/s/g,"")),n=t,$&&"sticky"in O&&(o=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,"")),x&&(e=(a=function(e){for(var t,n=e.length,r=0,o="",a=[],i={},s=!1,l=!1,c=0,u="";r<=n;r++){if("\\"===(t=e.charAt(r)))t+=e.charAt(++r);else if("]"===t)s=!1;else if(!s)switch(!0){case"["===t:s=!0;break;case"("===t:C.test(e.slice(r+1))&&(r+=2,l=!0),o+=t,c++;continue;case">"===t&&l:if(""===u||g(i,u))throw new SyntaxError("Invalid capture group name");i[u]=!0,a.push([u,c]),l=!1,u="";continue}l?u+=t:o+=t}return[o,a]}(e))[0],y=a[1]),l=i(k(e,t),d?this:S,P),(r||o||y.length)&&(c=m(l),r&&(c.dotAll=!0,c.raw=P(function(e){for(var t,n=e.length,r=0,o="",a=!1;r<=n;r++)"\\"!==(t=e.charAt(r))?a||"."!==t?("["===t?a=!0:"]"===t&&(a=!1),o+=t):o+="[\\s\\S]":o+=t+e.charAt(++r);return o}(e),n)),o&&(c.sticky=!0),y.length&&(c.groups=y)),e!==b)try{s(l,"source",""===b?"(?:)":b)}catch(e){}return l},E=function(e){e in P||l(P,e,{configurable:!0,get:function(){return k[e]},set:function(t){k[e]=t}})},L=c(k),I=0;L.length>I;)E(L[I++]);S.constructor=P,P.prototype=S,h(o,"RegExp",P)}y("RegExp")},function(e,t,n){"use strict";var r=n(75).PROPER,o=n(16),a=n(9),i=n(12),s=n(2),l=n(120),c=RegExp.prototype,u=c.toString,p=s((function(){return"/a/b"!=u.call({source:"a",flags:"b"})})),f=r&&"toString"!=u.name;(p||f)&&o(RegExp.prototype,"toString",(function(){var e=a(this),t=i(e.source),n=e.flags;return"/"+t+"/"+i(void 0===n&&e instanceof RegExp&&!("flags"in c)?l.call(e):n)}),{unsafe:!0})},function(e,t,n){"use strict";var r=n(33),o=n(10),a=[].slice,i={},s=function(e,t,n){if(!(t in i)){for(var r=[],o=0;o=51&&/native code/.test(e))return!1;var n=new q((function(e){e(1)})),r=function(e){e((function(){}),(function(){}))};return(n.constructor={})[D]=r,!(X=n.then((function(){}))instanceof r)||!t&&I&&!Y})),ee=Z||!k((function(e){q.all(e).catch((function(){}))})),te=function(e){var t;return!(!b(e)||!y(t=e.then))&&t},ne=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;O((function(){for(var r=e.value,o=1==e.state,a=0;n.length>a;){var i,s,l,c=n[a++],u=o?c.ok:c.fail,p=c.resolve,f=c.reject,d=c.domain;try{u?(o||(2===e.rejection&&ie(e),e.rejection=1),!0===u?i=r:(d&&d.enter(),i=u(r),d&&(d.exit(),l=!0)),i===c.promise?f(H("Promise-chain cycle")):(s=te(i))?s.call(i,p,f):p(i)):f(r)}catch(e){d&&!l&&d.exit(),f(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&oe(e)}))}},re=function(e,t,n){var r,o;G?((r=Q.createEvent("Event")).promise=t,r.reason=n,r.initEvent(e,!1,!0),c.dispatchEvent(r)):r={promise:t,reason:n},!Y&&(o=c["on"+e])?o(r):"unhandledrejection"===e&&A("Unhandled promise rejection",n)},oe=function(e){C.call(c,(function(){var t,n=e.facade,r=e.value;if(ae(e)&&(t=j((function(){M?W.emit("unhandledRejection",r,n):re("unhandledrejection",n,r)})),e.rejection=M||ae(e)?2:1,t.error))throw t.value}))},ae=function(e){return 1!==e.rejection&&!e.parent},ie=function(e){C.call(c,(function(){var t=e.facade;M?W.emit("rejectionHandled",t):re("rejectionhandled",t,e.value)}))},se=function(e,t,n){return function(r){e(t,r,n)}},le=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,ne(e,!0))},ce=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw H("Promise can't be resolved itself");var r=te(t);r?O((function(){var n={done:!1};try{r.call(t,se(ce,n,e),se(le,n,e))}catch(t){le(n,t,e)}})):(e.value=t,e.state=1,ne(e,!1))}catch(t){le({done:!1},t,e)}}};if(Z&&(V=(q=function(e){w(this,q,N),m(e),r.call(this);var t=F(this);try{e(se(ce,t),se(le,t))}catch(e){le(t,e)}}).prototype,(r=function(e){z(this,{type:N,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=d(V,{then:function(e,t){var n=U(this),r=J(S(this,q));return r.ok=!y(e)||e,r.fail=y(t)&&t,r.domain=M?W.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&ne(n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),o=function(){var e=new r,t=F(e);this.promise=e,this.resolve=se(ce,t),this.reject=se(le,t)},$.f=J=function(e){return e===q||e===a?new o(e):K(e)},!l&&y(p)&&B!==Object.prototype)){i=B.then,X||(f(B,"then",(function(e,t){var n=this;return new q((function(e,t){i.call(n,e,t)})).then(e,t)}),{unsafe:!0}),f(B,"catch",V.catch,{unsafe:!0}));try{delete B.constructor}catch(e){}h&&h(B,V)}s({global:!0,wrap:!0,forced:Z},{Promise:q}),v(q,N,!1,!0),g(N),a=u(N),s({target:N,stat:!0,forced:Z},{reject:function(e){var t=J(this);return t.reject.call(void 0,e),t.promise}}),s({target:N,stat:!0,forced:l||Z},{resolve:function(e){return T(l&&this===a?q:this,e)}}),s({target:N,stat:!0,forced:ee},{all:function(e){var t=this,n=J(t),r=n.resolve,o=n.reject,a=j((function(){var n=m(t.resolve),a=[],i=0,s=1;_(e,(function(e){var l=i++,c=!1;a.push(void 0),s++,n.call(t,e).then((function(e){c||(c=!0,a[l]=e,--s||r(a))}),o)})),--s||r(a)}));return a.error&&o(a.value),n.promise},race:function(e){var t=this,n=J(t),r=n.reject,o=j((function(){var o=m(t.resolve);_(e,(function(e){o.call(t,e).then(n.resolve,r)}))}));return o.error&&r(o.value),n.promise}})},function(e,t,n){var r=n(16);e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},function(e,t){e.exports=function(e,t,n){if(e instanceof t)return e;throw TypeError("Incorrect "+(n?n+" ":"")+"invocation")}},function(e,t,n){var r=n(9),o=n(160),a=n(31),i=n(89),s=n(161),l=n(116),c=n(162),u=function(e,t){this.stopped=e,this.result=t};e.exports=function(e,t,n){var p,f,d,h,v,g,m,y=n&&n.that,b=!(!n||!n.AS_ENTRIES),w=!(!n||!n.IS_ITERATOR),x=!(!n||!n.INTERRUPTED),_=i(t,y,1+b+x),k=function(e){return p&&c(p,"normal",e),new u(!0,e)},S=function(e){return b?(r(e),x?_(e[0],e[1],k):_(e[0],e[1])):x?_(e,k):_(e)};if(w)p=e;else{if(!(f=l(e)))throw TypeError(String(e)+" is not iterable");if(o(f)){for(d=0,h=a(e);h>d;d++)if((v=S(e[d]))&&v instanceof u)return v;return new u(!1)}p=s(e,f)}for(g=p.next;!(m=g.call(p)).done;){try{v=S(m.value)}catch(e){c(p,"throw",e)}if("object"==typeof v&&v&&v instanceof u)return v}return new u(!1)}},function(e,t,n){var r,o,a,i,s,l,c,u,p=n(3),f=n(35).f,d=n(165).set,h=n(166),v=n(258),g=n(259),m=n(92),y=p.MutationObserver||p.WebKitMutationObserver,b=p.document,w=p.process,x=p.Promise,_=f(p,"queueMicrotask"),k=_&&_.value;k||(r=function(){var e,t;for(m&&(e=w.domain)&&e.exit();o;){t=o.fn,o=o.next;try{t()}catch(e){throw o?i():a=void 0,e}}a=void 0,e&&e.enter()},h||m||g||!y||!b?!v&&x&&x.resolve?((c=x.resolve(void 0)).constructor=x,u=c.then,i=function(){u.call(c,r)}):i=m?function(){w.nextTick(r)}:function(){d.call(p,r)}:(s=!0,l=b.createTextNode(""),new y(r).observe(l,{characterData:!0}),i=function(){l.data=s=!s})),e.exports=k||function(e){var t={fn:e,next:void 0};a&&(a.next=t),o||(o=t,i()),a=t}},function(e,t,n){var r=n(32),o=n(3);e.exports=/ipad|iphone|ipod/i.test(r)&&void 0!==o.Pebble},function(e,t,n){var r=n(32);e.exports=/web0s(?!.*chrome)/i.test(r)},function(e,t,n){var r=n(3);e.exports=function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}},function(e,t){e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},function(e,t){e.exports="object"==typeof window},function(e,t,n){var r=n(1),o=n(264);r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},function(e,t,n){"use strict";var r=n(11),o=n(2),a=n(83),i=n(114),s=n(113),l=n(15),c=n(60),u=Object.assign,p=Object.defineProperty;e.exports=!u||o((function(){if(r&&1!==u({b:1},u(p({},"a",{enumerable:!0,get:function(){p(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol();return e[n]=7,"abcdefghijklmnopqrst".split("").forEach((function(e){t[e]=e})),7!=u({},e)[n]||"abcdefghijklmnopqrst"!=a(u({},t)).join("")}))?function(e,t){for(var n=l(e),o=arguments.length,u=1,p=i.f,f=s.f;o>u;)for(var d,h=c(arguments[u++]),v=p?a(h).concat(p(h)):a(h),g=v.length,m=0;g>m;)d=v[m++],r&&!f.call(h,d)||(n[d]=h[d]);return n}:u},function(e,t,n){"use strict";var r=n(1),o=n(38),a=n(158),i=n(2),s=n(23),l=n(6),c=n(118),u=n(167),p=n(16);if(r({target:"Promise",proto:!0,real:!0,forced:!!a&&i((function(){a.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(e){var t=c(this,s("Promise")),n=l(e);return this.then(n?function(n){return u(t,e()).then((function(){return n}))}:e,n?function(n){return u(t,e()).then((function(){throw n}))}:e)}}),!o&&l(a)){var f=s("Promise").prototype.finally;a.prototype.finally!==f&&p(a.prototype,"finally",f,{unsafe:!0})}},function(e,t,n){"use strict";var r=n(117),o=n(90);e.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},function(e,t,n){var r=n(64),o=n(91),a=n(10),i=n(4)("species");e.exports=function(e){var t;return r(e)&&(t=e.constructor,(o(t)&&(t===Array||r(t.prototype))||a(t)&&null===(t=t[i]))&&(t=void 0)),void 0===t?Array:t}},function(e,t,n){var r=n(33),o=n(15),a=n(60),i=n(31),s=function(e){return function(t,n,s,l){r(n);var c=o(t),u=a(c),p=i(c),f=e?p-1:0,d=e?-1:1;if(s<2)for(;;){if(f in u){l=u[f],f+=d;break}if(f+=d,e?f<0:p<=f)throw TypeError("Reduce of empty array with no initial value")}for(;e?f>=0:p>f;f+=d)f in u&&(l=n(l,u[f],f,c));return l}};e.exports={left:s(!1),right:s(!0)}},function(e,t,n){"use strict";var r,o=n(1),a=n(35).f,i=n(48),s=n(12),l=n(176),c=n(19),u=n(177),p=n(38),f="".startsWith,d=Math.min,h=u("startsWith");o({target:"String",proto:!0,forced:!!(p||h||(r=a(String.prototype,"startsWith"),!r||r.writable))&&!h},{startsWith:function(e){var t=s(c(this));l(e);var n=i(d(arguments.length>1?arguments[1]:void 0,t.length)),r=s(e);return f?f.call(t,r,n):t.slice(n,n+r.length)===r}})},function(e,t,n){var r=n(1),o=n(179),a=n(2),i=n(10),s=n(271).onFreeze,l=Object.freeze;r({target:"Object",stat:!0,forced:a((function(){l(1)})),sham:!o},{freeze:function(e){return l&&i(e)?l(s(e)):e}})},function(e,t,n){var r=n(1),o=n(61),a=n(10),i=n(13),s=n(14).f,l=n(49),c=n(180),u=n(79),p=n(179),f=!1,d=u("meta"),h=0,v=Object.isExtensible||function(){return!0},g=function(e){s(e,d,{value:{objectID:"O"+h++,weakData:{}}})},m=e.exports={enable:function(){m.enable=function(){},f=!0;var e=l.f,t=[].splice,n={};n[d]=1,e(n).length&&(l.f=function(n){for(var r=e(n),o=0,a=r.length;o1?arguments[1]:void 0,h=void 0!==d;h&&(d=r(d,f>2?arguments[2]:void 0,2));var v,g,m,y,b,w,x=p(t),_=0;if(!x||this==Array&&i(x))for(v=l(t),g=n?new this(v):Array(v);v>_;_++)w=h?d(t[_],_):t[_],c(g,_,w);else for(b=(y=u(t,x)).next,g=n?new this:[];!(m=b.call(y)).done;_++)w=h?a(y,d,[m.value,_],!0):m.value,c(g,_,w);return g.length=_,g}},function(e,t,n){var r=n(9),o=n(162);e.exports=function(e,t,n,a){try{return a?t(r(n)[0],n[1]):t(n)}catch(t){o(e,"throw",t)}}},function(e,t,n){var r=n(15),o=Math.floor,a="".replace,i=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,s=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,l,c,u){var p=n+e.length,f=l.length,d=s;return void 0!==c&&(c=r(c),d=i),a.call(u,d,(function(r,a){var i;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(p);case"<":i=c[a.slice(1,-1)];break;default:var s=+a;if(0===s)return r;if(s>f){var u=o(s/10);return 0===u?r:u<=f?void 0===l[u-1]?a.charAt(1):l[u-1]+a.charAt(1):r}i=l[s-1]}return void 0===i?"":i}))}},function(e,t,n){"use strict";var r=n(1),o=n(111).includes,a=n(146);r({target:"Array",proto:!0},{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),a("includes")},function(e,t,n){"use strict";var r=n(1),o=n(176),a=n(19),i=n(12);r({target:"String",proto:!0,forced:!n(177)("includes")},{includes:function(e){return!!~i(a(this)).indexOf(i(o(e)),arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(188),o=n(279);e.exports=function e(t,n,a,i,s){var l=-1,c=t.length;for(a||(a=o),s||(s=[]);++l0&&a(u)?n>1?e(u,n-1,a,i,s):r(s,u):i||(s[s.length]=u)}return s}},function(e,t,n){var r=n(67),o=n(125),a=n(29),i=r?r.isConcatSpreadable:void 0;e.exports=function(e){return a(e)||o(e)||!!(i&&e&&e[i])}},function(e,t,n){var r=n(68),o=n(54);e.exports=function(e){return o(e)&&"[object Arguments]"==r(e)}},function(e,t,n){var r=n(67),o=Object.prototype,a=o.hasOwnProperty,i=o.toString,s=r?r.toStringTag:void 0;e.exports=function(e){var t=a.call(e,s),n=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=i.call(e);return r&&(t?e[s]=n:delete e[s]),o}},function(e,t){var n=Object.prototype.toString;e.exports=function(e){return n.call(e)}},function(e,t,n){var r=n(284),o=n(340),a=n(133),i=n(29),s=n(351);e.exports=function(e){return"function"==typeof e?e:null==e?a:"object"==typeof e?i(e)?o(e[0],e[1]):r(e):s(e)}},function(e,t,n){var r=n(285),o=n(339),a=n(206);e.exports=function(e){var t=o(e);return 1==t.length&&t[0][2]?a(t[0][0],t[0][1]):function(n){return n===e||r(n,e,t)}}},function(e,t,n){var r=n(190),o=n(194);e.exports=function(e,t,n,a){var i=n.length,s=i,l=!a;if(null==e)return!s;for(e=Object(e);i--;){var c=n[i];if(l&&c[2]?c[1]!==e[c[0]]:!(c[0]in e))return!1}for(;++i-1}},function(e,t,n){var r=n(97);e.exports=function(e,t){var n=this.__data__,o=r(n,e);return o<0?(++this.size,n.push([e,t])):n[o][1]=t,this}},function(e,t,n){var r=n(96);e.exports=function(){this.__data__=new r,this.size=0}},function(e,t){e.exports=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}},function(e,t){e.exports=function(e){return this.__data__.get(e)}},function(e,t){e.exports=function(e){return this.__data__.has(e)}},function(e,t,n){var r=n(96),o=n(126),a=n(128);e.exports=function(e,t){var n=this.__data__;if(n instanceof r){var i=n.__data__;if(!o||i.length<199)return i.push([e,t]),this.size=++n.size,this;n=this.__data__=new a(i)}return n.set(e,t),this.size=n.size,this}},function(e,t,n){var r=n(192),o=n(297),a=n(127),i=n(193),s=/^\[object .+?Constructor\]$/,l=Function.prototype,c=Object.prototype,u=l.toString,p=c.hasOwnProperty,f=RegExp("^"+u.call(p).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!a(e)||o(e))&&(r(e)?f:s).test(i(e))}},function(e,t,n){var r,o=n(298),a=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";e.exports=function(e){return!!a&&a in e}},function(e,t,n){var r=n(28)["__core-js_shared__"];e.exports=r},function(e,t){e.exports=function(e,t){return null==e?void 0:e[t]}},function(e,t,n){var r=n(301),o=n(96),a=n(126);e.exports=function(){this.size=0,this.__data__={hash:new r,map:new(a||o),string:new r}}},function(e,t,n){var r=n(302),o=n(303),a=n(304),i=n(305),s=n(306);function l(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}},function(e,t,n){var r=n(196),o=n(363),a=n(368),i=n(197),s=n(369),l=n(129);e.exports=function(e,t,n){var c=-1,u=o,p=e.length,f=!0,d=[],h=d;if(n)f=!1,u=a;else if(p>=200){var v=t?null:s(e);if(v)return l(v);f=!1,u=i,h=new r}else h=t?[]:d;e:for(;++c-1}},function(e,t,n){var r=n(365),o=n(366),a=n(367);e.exports=function(e,t,n){return t==t?a(e,t,n):r(e,o,n)}},function(e,t){e.exports=function(e,t,n,r){for(var o=e.length,a=n+(r?1:-1);r?a--:++a>>0||(p.test(n)?16:10))}:l},function(e,t,n){"use strict";n(209)},function(e,t,n){},function(e,t,n){"use strict";var r=n(2),o=n(379).start,a=Math.abs,i=Date.prototype,s=i.getTime,l=i.toISOString;e.exports=r((function(){return"0385-07-25T07:06:39.999Z"!=l.call(new Date(-50000000000001))}))||!r((function(){l.call(new Date(NaN))}))?function(){if(!isFinite(s.call(this)))throw RangeError("Invalid time value");var e=this.getUTCFullYear(),t=this.getUTCMilliseconds(),n=e<0?"-":e>9999?"+":"";return n+o(a(e),n?6:4,0)+"-"+o(this.getUTCMonth()+1,2,0)+"-"+o(this.getUTCDate(),2,0)+"T"+o(this.getUTCHours(),2,0)+":"+o(this.getUTCMinutes(),2,0)+":"+o(this.getUTCSeconds(),2,0)+"."+o(t,3,0)+"Z"}:l},function(e,t,n){var r=n(48),o=n(12),a=n(380),i=n(19),s=Math.ceil,l=function(e){return function(t,n,l){var c,u,p=o(i(t)),f=r(n),d=p.length,h=void 0===l?" ":o(l);return f<=d||""==h?p:(c=f-d,(u=a.call(h,s(c/h.length))).length>c&&(u=u.slice(0,c)),e?p+u:u+p)}};e.exports={start:l(!1),end:l(!0)}},function(e,t,n){"use strict";var r=n(59),o=n(12),a=n(19);e.exports=function(e){var t=o(a(this)),n="",i=r(e);if(i<0||i==1/0)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n}},function(e,t){var n=Math.floor,r=function(e,t){var i=e.length,s=n(i/2);return i<8?o(e,t):a(r(e.slice(0,s),t),r(e.slice(s),t),t)},o=function(e,t){for(var n,r,o=e.length,a=1;a0;)e[r]=e[--r];r!==a++&&(e[r]=n)}return e},a=function(e,t,n){for(var r=e.length,o=t.length,a=0,i=0,s=[];a1||"".split(/.?/).length?function(e,n){var r=u(i(this)),a=void 0===n?4294967295:n>>>0;if(0===a)return[];if(void 0===e)return[r];if(!o(e))return t.call(r,e,a);for(var s,l,c,p=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,v=new RegExp(e.source,f+"g");(s=d.call(v,r))&&!((l=v.lastIndex)>h&&(p.push(r.slice(h,s.index)),s.length>1&&s.index=a));)v.lastIndex===s.index&&v.lastIndex++;return h===r.length?!c&&v.test("")||p.push(""):p.push(r.slice(h)),p.length>a?p.slice(0,a):p}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var o=i(this),a=null==t?void 0:p(t,e);return a?a.call(t,o,n):r.call(u(o),t,n)},function(e,o){var i=a(this),p=u(e),d=n(r,i,p,o,r!==t);if(d.done)return d.value;var h=s(i,RegExp),v=i.unicode,m=(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.unicode?"u":"")+(g?"g":"y"),b=new h(g?"^(?:"+i.source+")":i,m),w=void 0===o?4294967295:o>>>0;if(0===w)return[];if(0===p.length)return null===f(b,p)?[p]:[];for(var x=0,_=0,k=[];_2)if(43===(t=(p=g(p)).charCodeAt(0))||45===t){if(88===(n=p.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(p.charCodeAt(1)){case 66:case 98:r=2,o=49;break;case 79:case 111:r=8,o=55;break;default:return+p}for(i=(a=p.slice(2)).length,s=0;so)return NaN;return parseInt(a,r)}return+p};if(a("Number",!m(" 0o1")||!m("0b1")||m("+0x1"))){for(var x,_=function(e){var t=arguments.length<1?0:m(b(e)),n=this;return n instanceof _&&p((function(){v(n)}))?l(Object(t),n,_):t},k=r?f(m):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range".split(","),S=0;k.length>S;S++)s(m,x=k[S])&&!s(_,x)&&h(_,x,d(m,x));_.prototype=y,y.constructor=_,i(o,"Number",_)}},function(e,t){var n=1..valueOf;e.exports=function(e){return n.call(e)}},function(e,t,n){"use strict";n(214)},function(e,t,n){ +/*! + * Valine v1.4.14 + * (c) 2017-2020 xCss + * Released under the GPL-2.0 License. + * Last Update: 2020/4/26 下午8:39:08 + */ +e.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=63)}([function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a=r(n(38)),i=r(n(28)),s=r(n(27)),l=r(n(42)),c=document,u=navigator,p=/[&<>"'`\\]/g,f=RegExp(p.source),d=/&(?:amp|lt|gt|quot|#39|#x60|#x5c);/g,h=RegExp(d.source),v={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","\\":"\"},g={};for(var m in v)g[v[m]]=m;var y=null;Array.prototype.forEach||(Array.prototype.forEach=function(e,t){var n,r;if(null==this)throw new TypeError(" this is null or not defined");var o=Object(this),a=o.length>>>0;if("function"!=typeof e)throw new TypeError(e+" is not a function");for(arguments.length>1&&(n=t),r=0;r=200&&o<300?e.success&&e.success(JSON.parse(r.responseText)):e.fail&&e.fail(o)}},"GET"==e.type?(r.open("GET",e.url+"?"+t,e.async),r.send(null)):"POST"==e.type&&(r.open("POST",e.url,e.async),null==e.contentType||null==e.contentType?r.send(t):(r.setRequestHeader("Content-Type",e.contentType),r.send(JSON.stringify(e.data)))),n=setTimeout((function(e){clearTimeout(n),r.abort()}),e.timeout)}}),t.default=i.default},function(e,t,n){"use strict";var r=TypeError,o=Object.getOwnPropertyDescriptor;if(o)try{o({},"")}catch(e){o=null}var a=function(){throw new r},i=o?function(){try{return a}catch(e){try{return o(arguments,"callee").get}catch(e){return a}}}():a,s=n(47)(),l=Object.getPrototypeOf||function(e){return e.__proto__},c=void 0,u=void 0,p=void 0,f="undefined"==typeof Uint8Array?void 0:l(Uint8Array),d={"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"%ArrayBufferPrototype%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer.prototype,"%ArrayIteratorPrototype%":s?l([][Symbol.iterator]()):void 0,"%ArrayPrototype%":Array.prototype,"%ArrayProto_entries%":Array.prototype.entries,"%ArrayProto_forEach%":Array.prototype.forEach,"%ArrayProto_keys%":Array.prototype.keys,"%ArrayProto_values%":Array.prototype.values,"%AsyncFromSyncIteratorPrototype%":void 0,"%AsyncFunction%":void 0,"%AsyncFunctionPrototype%":void 0,"%AsyncGenerator%":void 0,"%AsyncGeneratorFunction%":u,"%AsyncGeneratorPrototype%":void 0,"%AsyncIteratorPrototype%":p&&s&&Symbol.asyncIterator?p[Symbol.asyncIterator]():void 0,"%Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"%Boolean%":Boolean,"%BooleanPrototype%":Boolean.prototype,"%DataView%":"undefined"==typeof DataView?void 0:DataView,"%DataViewPrototype%":"undefined"==typeof DataView?void 0:DataView.prototype,"%Date%":Date,"%DatePrototype%":Date.prototype,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%ErrorPrototype%":Error.prototype,"%eval%":eval,"%EvalError%":EvalError,"%EvalErrorPrototype%":EvalError.prototype,"%Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"%Float32ArrayPrototype%":"undefined"==typeof Float32Array?void 0:Float32Array.prototype,"%Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"%Float64ArrayPrototype%":"undefined"==typeof Float64Array?void 0:Float64Array.prototype,"%Function%":Function,"%FunctionPrototype%":Function.prototype,"%Generator%":void 0,"%GeneratorFunction%":c,"%GeneratorPrototype%":void 0,"%Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"%Int8ArrayPrototype%":"undefined"==typeof Int8Array?void 0:Int8Array.prototype,"%Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"%Int16ArrayPrototype%":"undefined"==typeof Int16Array?void 0:Int8Array.prototype,"%Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"%Int32ArrayPrototype%":"undefined"==typeof Int32Array?void 0:Int32Array.prototype,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":s?l(l([][Symbol.iterator]())):void 0,"%JSON%":"object"==typeof JSON?JSON:void 0,"%JSONParse%":"object"==typeof JSON?JSON.parse:void 0,"%Map%":"undefined"==typeof Map?void 0:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&s?l((new Map)[Symbol.iterator]()):void 0,"%MapPrototype%":"undefined"==typeof Map?void 0:Map.prototype,"%Math%":Math,"%Number%":Number,"%NumberPrototype%":Number.prototype,"%Object%":Object,"%ObjectPrototype%":Object.prototype,"%ObjProto_toString%":Object.prototype.toString,"%ObjProto_valueOf%":Object.prototype.valueOf,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?void 0:Promise,"%PromisePrototype%":"undefined"==typeof Promise?void 0:Promise.prototype,"%PromiseProto_then%":"undefined"==typeof Promise?void 0:Promise.prototype.then,"%Promise_all%":"undefined"==typeof Promise?void 0:Promise.all,"%Promise_reject%":"undefined"==typeof Promise?void 0:Promise.reject,"%Promise_resolve%":"undefined"==typeof Promise?void 0:Promise.resolve,"%Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"%RangeError%":RangeError,"%RangeErrorPrototype%":RangeError.prototype,"%ReferenceError%":ReferenceError,"%ReferenceErrorPrototype%":ReferenceError.prototype,"%Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"%RegExp%":RegExp,"%RegExpPrototype%":RegExp.prototype,"%Set%":"undefined"==typeof Set?void 0:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&s?l((new Set)[Symbol.iterator]()):void 0,"%SetPrototype%":"undefined"==typeof Set?void 0:Set.prototype,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"%SharedArrayBufferPrototype%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer.prototype,"%String%":String,"%StringIteratorPrototype%":s?l(""[Symbol.iterator]()):void 0,"%StringPrototype%":String.prototype,"%Symbol%":s?Symbol:void 0,"%SymbolPrototype%":s?Symbol.prototype:void 0,"%SyntaxError%":SyntaxError,"%SyntaxErrorPrototype%":SyntaxError.prototype,"%ThrowTypeError%":i,"%TypedArray%":f,"%TypedArrayPrototype%":f?f.prototype:void 0,"%TypeError%":r,"%TypeErrorPrototype%":r.prototype,"%Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"%Uint8ArrayPrototype%":"undefined"==typeof Uint8Array?void 0:Uint8Array.prototype,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"%Uint8ClampedArrayPrototype%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray.prototype,"%Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"%Uint16ArrayPrototype%":"undefined"==typeof Uint16Array?void 0:Uint16Array.prototype,"%Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"%Uint32ArrayPrototype%":"undefined"==typeof Uint32Array?void 0:Uint32Array.prototype,"%URIError%":URIError,"%URIErrorPrototype%":URIError.prototype,"%WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"%WeakMapPrototype%":"undefined"==typeof WeakMap?void 0:WeakMap.prototype,"%WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet,"%WeakSetPrototype%":"undefined"==typeof WeakSet?void 0:WeakSet.prototype},h=n(4).call(Function.call,String.prototype.replace),v=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,g=/\\(\\)?/g,m=function(e){var t=[];return h(e,v,(function(e,n,r,o){t[t.length]=r?h(o,g,"$1"):n||e})),t},y=function(e,t){if(!(e in d))throw new SyntaxError("intrinsic "+e+" does not exist!");if(void 0===d[e]&&!t)throw new r("intrinsic "+e+" exists, but is not available. Please file an issue!");return d[e]};e.exports=function(e,t){if("string"!=typeof e||0===e.length)throw new TypeError("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof t)throw new TypeError('"allowMissing" argument must be a boolean');for(var n=m(e),a=y("%"+(n.length>0?n[0]:"")+"%",t),i=1;i=n.length){var s=o(a,n[i]);if(!t&&!(n[i]in a))throw new r("base intrinsic for "+e+" exists, but the property is not available.");a=s?s.get||s.value:a[n[i]]}else a=a[n[i]];return a}},function(e,t,n){"use strict";t.__esModule=!0,t.DEFAULT_EMOJI_CDN="//img.t.sinajs.cn/t4/appstyle/expression/ext/normal/",t.DB_NAME="Comment",t.defaultConfig={lang:"zh-CN",langMode:null,appId:"",appKey:"",clazzName:"Comment",meta:["nick","mail","link"],path:location.pathname,placeholder:"Just Go Go",pageSize:10,recordIP:!0,serverURLs:"",visitor:!1,emojiCDN:"",emojiMaps:void 0,enableQQ:!1,requiredFields:[]},t.defaultMeta=["nick","mail","link"],t.QQCacheKey="_v_Cache_Q",t.MetaCacheKey="_v_Cache_Meta",t.RandomStr=(Date.now()+Math.round(1e3*Math.random())).toString(32),t.VERSION="1.4.14"},function(e,t,n){var r=n(7),o=n(29);for(var a in(t=e.exports=function(e,t){return new o(t).process(e)}).FilterCSS=o,r)t[a]=r[a];"undefined"!=typeof window&&(window.filterCSS=e.exports)},function(e,t,n){"use strict";var r=n(32);e.exports=Function.prototype.bind||r},function(e,t){e.exports={indexOf:function(e,t){var n,r;if(Array.prototype.indexOf)return e.indexOf(t);for(n=0,r=e.length;n':""}};t.default=r},function(e,t){function n(){var e={"align-content":!1,"align-items":!1,"align-self":!1,"alignment-adjust":!1,"alignment-baseline":!1,all:!1,"anchor-point":!1,animation:!1,"animation-delay":!1,"animation-direction":!1,"animation-duration":!1,"animation-fill-mode":!1,"animation-iteration-count":!1,"animation-name":!1,"animation-play-state":!1,"animation-timing-function":!1,azimuth:!1,"backface-visibility":!1,background:!0,"background-attachment":!0,"background-clip":!0,"background-color":!0,"background-image":!0,"background-origin":!0,"background-position":!0,"background-repeat":!0,"background-size":!0,"baseline-shift":!1,binding:!1,bleed:!1,"bookmark-label":!1,"bookmark-level":!1,"bookmark-state":!1,border:!0,"border-bottom":!0,"border-bottom-color":!0,"border-bottom-left-radius":!0,"border-bottom-right-radius":!0,"border-bottom-style":!0,"border-bottom-width":!0,"border-collapse":!0,"border-color":!0,"border-image":!0,"border-image-outset":!0,"border-image-repeat":!0,"border-image-slice":!0,"border-image-source":!0,"border-image-width":!0,"border-left":!0,"border-left-color":!0,"border-left-style":!0,"border-left-width":!0,"border-radius":!0,"border-right":!0,"border-right-color":!0,"border-right-style":!0,"border-right-width":!0,"border-spacing":!0,"border-style":!0,"border-top":!0,"border-top-color":!0,"border-top-left-radius":!0,"border-top-right-radius":!0,"border-top-style":!0,"border-top-width":!0,"border-width":!0,bottom:!1,"box-decoration-break":!0,"box-shadow":!0,"box-sizing":!0,"box-snap":!0,"box-suppress":!0,"break-after":!0,"break-before":!0,"break-inside":!0,"caption-side":!1,chains:!1,clear:!0,clip:!1,"clip-path":!1,"clip-rule":!1,color:!0,"color-interpolation-filters":!0,"column-count":!1,"column-fill":!1,"column-gap":!1,"column-rule":!1,"column-rule-color":!1,"column-rule-style":!1,"column-rule-width":!1,"column-span":!1,"column-width":!1,columns:!1,contain:!1,content:!1,"counter-increment":!1,"counter-reset":!1,"counter-set":!1,crop:!1,cue:!1,"cue-after":!1,"cue-before":!1,cursor:!1,direction:!1,display:!0,"display-inside":!0,"display-list":!0,"display-outside":!0,"dominant-baseline":!1,elevation:!1,"empty-cells":!1,filter:!1,flex:!1,"flex-basis":!1,"flex-direction":!1,"flex-flow":!1,"flex-grow":!1,"flex-shrink":!1,"flex-wrap":!1,float:!1,"float-offset":!1,"flood-color":!1,"flood-opacity":!1,"flow-from":!1,"flow-into":!1,font:!0,"font-family":!0,"font-feature-settings":!0,"font-kerning":!0,"font-language-override":!0,"font-size":!0,"font-size-adjust":!0,"font-stretch":!0,"font-style":!0,"font-synthesis":!0,"font-variant":!0,"font-variant-alternates":!0,"font-variant-caps":!0,"font-variant-east-asian":!0,"font-variant-ligatures":!0,"font-variant-numeric":!0,"font-variant-position":!0,"font-weight":!0,grid:!1,"grid-area":!1,"grid-auto-columns":!1,"grid-auto-flow":!1,"grid-auto-rows":!1,"grid-column":!1,"grid-column-end":!1,"grid-column-start":!1,"grid-row":!1,"grid-row-end":!1,"grid-row-start":!1,"grid-template":!1,"grid-template-areas":!1,"grid-template-columns":!1,"grid-template-rows":!1,"hanging-punctuation":!1,height:!0,hyphens:!1,icon:!1,"image-orientation":!1,"image-resolution":!1,"ime-mode":!1,"initial-letters":!1,"inline-box-align":!1,"justify-content":!1,"justify-items":!1,"justify-self":!1,left:!1,"letter-spacing":!0,"lighting-color":!0,"line-box-contain":!1,"line-break":!1,"line-grid":!1,"line-height":!1,"line-snap":!1,"line-stacking":!1,"line-stacking-ruby":!1,"line-stacking-shift":!1,"line-stacking-strategy":!1,"list-style":!0,"list-style-image":!0,"list-style-position":!0,"list-style-type":!0,margin:!0,"margin-bottom":!0,"margin-left":!0,"margin-right":!0,"margin-top":!0,"marker-offset":!1,"marker-side":!1,marks:!1,mask:!1,"mask-box":!1,"mask-box-outset":!1,"mask-box-repeat":!1,"mask-box-slice":!1,"mask-box-source":!1,"mask-box-width":!1,"mask-clip":!1,"mask-image":!1,"mask-origin":!1,"mask-position":!1,"mask-repeat":!1,"mask-size":!1,"mask-source-type":!1,"mask-type":!1,"max-height":!0,"max-lines":!1,"max-width":!0,"min-height":!0,"min-width":!0,"move-to":!1,"nav-down":!1,"nav-index":!1,"nav-left":!1,"nav-right":!1,"nav-up":!1,"object-fit":!1,"object-position":!1,opacity:!1,order:!1,orphans:!1,outline:!1,"outline-color":!1,"outline-offset":!1,"outline-style":!1,"outline-width":!1,overflow:!1,"overflow-wrap":!1,"overflow-x":!1,"overflow-y":!1,padding:!0,"padding-bottom":!0,"padding-left":!0,"padding-right":!0,"padding-top":!0,page:!1,"page-break-after":!1,"page-break-before":!1,"page-break-inside":!1,"page-policy":!1,pause:!1,"pause-after":!1,"pause-before":!1,perspective:!1,"perspective-origin":!1,pitch:!1,"pitch-range":!1,"play-during":!1,position:!1,"presentation-level":!1,quotes:!1,"region-fragment":!1,resize:!1,rest:!1,"rest-after":!1,"rest-before":!1,richness:!1,right:!1,rotation:!1,"rotation-point":!1,"ruby-align":!1,"ruby-merge":!1,"ruby-position":!1,"shape-image-threshold":!1,"shape-outside":!1,"shape-margin":!1,size:!1,speak:!1,"speak-as":!1,"speak-header":!1,"speak-numeral":!1,"speak-punctuation":!1,"speech-rate":!1,stress:!1,"string-set":!1,"tab-size":!1,"table-layout":!1,"text-align":!0,"text-align-last":!0,"text-combine-upright":!0,"text-decoration":!0,"text-decoration-color":!0,"text-decoration-line":!0,"text-decoration-skip":!0,"text-decoration-style":!0,"text-emphasis":!0,"text-emphasis-color":!0,"text-emphasis-position":!0,"text-emphasis-style":!0,"text-height":!0,"text-indent":!0,"text-justify":!0,"text-orientation":!0,"text-overflow":!0,"text-shadow":!0,"text-space-collapse":!0,"text-transform":!0,"text-underline-position":!0,"text-wrap":!0,top:!1,transform:!1,"transform-origin":!1,"transform-style":!1,transition:!1,"transition-delay":!1,"transition-duration":!1,"transition-property":!1,"transition-timing-function":!1,"unicode-bidi":!1,"vertical-align":!1,visibility:!1,"voice-balance":!1,"voice-duration":!1,"voice-family":!1,"voice-pitch":!1,"voice-range":!1,"voice-rate":!1,"voice-stress":!1,"voice-volume":!1,volume:!1,"white-space":!1,widows:!1,width:!0,"will-change":!1,"word-break":!0,"word-spacing":!0,"word-wrap":!0,"wrap-flow":!1,"wrap-through":!1,"writing-mode":!1,"z-index":!1};return e}var r=/javascript\s*\:/gim;t.whiteList=n(),t.getDefaultWhiteList=n,t.onAttr=function(e,t,n){},t.onIgnoreAttr=function(e,t,n){},t.safeAttrValue=function(e,t){return r.test(t)?"":t}},function(e,t){e.exports={indexOf:function(e,t){var n,r;if(Array.prototype.indexOf)return e.indexOf(t);for(n=0,r=e.length;n2?arguments[2]:{},a=r(t);o&&(a=i.call(a,Object.getOwnPropertySymbols(t)));for(var s=0;s=0&&"[object Function]"===r.call(e.callee)),n}},function(e,t,n){"use strict";var r=n(45),o=n(44),a=n(46)("String.prototype.replace"),i=/^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/,s=/[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/;e.exports=function(){var e=o(r(this));return a(a(e,i,""),s,"")}},function(e,t,n){"use strict";var r=n(4),o=n(1)("%Function%"),a=o.apply,i=o.call;e.exports=function(){return r.apply(i,arguments)},e.exports.apply=function(){return r.apply(a,arguments)}},function(e,t,n){"use strict";var r=n(11);e.exports=function(){return String.prototype.trim&&"​"==="​".trim()?String.prototype.trim:r}},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){function r(){return{a:["target","href","title"],abbr:["title"],address:[],area:["shape","coords","href","alt"],article:[],aside:[],audio:["autoplay","controls","loop","preload","src"],b:[],bdi:["dir"],bdo:["dir"],big:[],blockquote:["cite"],br:[],caption:[],center:[],cite:[],code:[],col:["align","valign","span","width"],colgroup:["align","valign","span","width"],dd:[],del:["datetime"],details:["open"],div:[],dl:[],dt:[],em:[],font:["color","size","face"],footer:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],header:[],hr:[],i:[],img:["src","alt","title","width","height"],ins:["datetime"],li:[],mark:[],nav:[],ol:[],p:[],pre:[],s:[],section:[],small:[],span:[],sub:[],sup:[],strong:[],table:["width","border","align","valign"],tbody:["align","valign"],td:["width","rowspan","colspan","align","valign"],tfoot:["align","valign"],th:["width","rowspan","colspan","align","valign"],thead:["align","valign"],tr:["rowspan","align","valign"],tt:[],u:[],ul:[],video:["autoplay","controls","loop","preload","src","height","width"]}}function o(e){return e.replace(g,"<").replace(m,">")}function a(e){return e.replace(y,""")}function i(e){return e.replace(b,'"')}function s(e){return e.replace(w,(function(e,t){return"x"===t[0]||"X"===t[0]?String.fromCharCode(parseInt(t.substr(1),16)):String.fromCharCode(parseInt(t,10))}))}function l(e){return e.replace(x,":").replace(_," ")}function c(e){for(var t="",n=0,r=e.length;n/g,y=/"/g,b=/"/g,w=/&#([a-zA-Z0-9]*);?/gim,x=/:?/gim,_=/&newline;?/gim,k=/((j\s*a\s*v\s*a|v\s*b|l\s*i\s*v\s*e)\s*s\s*c\s*r\s*i\s*p\s*t\s*|m\s*o\s*c\s*h\s*a)\:/gi,S=/e\s*x\s*p\s*r\s*e\s*s\s*s\s*i\s*o\s*n\s*\(.*/gi,C=/u\s*r\s*l\s*\(.*/gi,O=//g;t.whiteList={a:["target","href","title"],abbr:["title"],address:[],area:["shape","coords","href","alt"],article:[],aside:[],audio:["autoplay","controls","loop","preload","src"],b:[],bdi:["dir"],bdo:["dir"],big:[],blockquote:["cite"],br:[],caption:[],center:[],cite:[],code:[],col:["align","valign","span","width"],colgroup:["align","valign","span","width"],dd:[],del:["datetime"],details:["open"],div:[],dl:[],dt:[],em:[],font:["color","size","face"],footer:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],header:[],hr:[],i:[],img:["src","alt","title","width","height"],ins:["datetime"],li:[],mark:[],nav:[],ol:[],p:[],pre:[],s:[],section:[],small:[],span:[],sub:[],sup:[],strong:[],table:["width","border","align","valign"],tbody:["align","valign"],td:["width","rowspan","colspan","align","valign"],tfoot:["align","valign"],th:["width","rowspan","colspan","align","valign"],thead:["align","valign"],tr:["rowspan","align","valign"],tt:[],u:[],ul:[],video:["autoplay","controls","loop","preload","src","height","width"]},t.getDefaultWhiteList=r,t.onTag=function(e,t,n){},t.onIgnoreTag=function(e,t,n){},t.onTagAttr=function(e,t,n){},t.onIgnoreTagAttr=function(e,t,n){},t.safeAttrValue=function(e,t,n,r){if(n=u(n),"href"===t||"src"===t){if("#"===(n=h.trim(n)))return"#";if("http://"!==n.substr(0,7)&&"https://"!==n.substr(0,8)&&"mailto:"!==n.substr(0,7)&&"tel:"!==n.substr(0,4)&&"#"!==n[0]&&"/"!==n[0])return""}else if("background"===t){if(k.lastIndex=0,k.test(n))return""}else if("style"===t){if(S.lastIndex=0,S.test(n))return"";if(C.lastIndex=0,C.test(n)&&(k.lastIndex=0,k.test(n)))return"";!1!==r&&(n=(r=r||v).process(n))}return p(n)},t.escapeHtml=o,t.escapeQuote=a,t.unescapeQuote=i,t.escapeHtmlEntities=s,t.escapeDangerHtml5Entities=l,t.clearNonPrintableCharacter=c,t.friendlyAttrValue=u,t.escapeAttrValue=p,t.onIgnoreTagStripAll=function(){return""},t.StripTagBody=function(e,t){function n(t){return!!r||-1!==h.indexOf(e,t)}"function"!=typeof t&&(t=function(){});var r=!Array.isArray(e),o=[],a=!1;return{onIgnoreTag:function(e,r,i){if(n(e)){if(i.isClosing){var s="[/removed]",l=i.position+s.length;return o.push([!1!==a?a:i.position,l]),a=!1,s}return a||(a=i.position),"[removed]"}return t(e,r,i)},remove:function(e){var t="",n=0;return h.forEach(o,(function(r){t+=e.slice(n,r[0]),n=r[1]})),t+=e.slice(n)}}},t.stripCommentTag=function(e){return e.replace(O,"")},t.stripBlankChar=function(e){var t=e.split("");return(t=t.filter((function(e){var t=e.charCodeAt(0);return!(127===t||t<=31&&10!==t&&13!==t)}))).join("")},t.cssFilter=v,t.getDefaultCSSWhiteList=d},function(e,t,n){function r(e){var t=l.spaceIndex(e);if(-1===t)var n=e.slice(1,-1);else n=e.slice(1,t+1);return"/"===(n=l.trim(n).toLowerCase()).slice(0,1)&&(n=n.slice(1)),"/"===n.slice(-1)&&(n=n.slice(0,-1)),n}function o(e){return"0;t--){var n=e[t];if(" "!==n)return"="===n?t:-1}}function s(e){return function(e){return'"'===e[0]&&'"'===e[e.length-1]||"'"===e[0]&&"'"===e[e.length-1]}(e)?e.substr(1,e.length-2):e}var l=n(5),c=/[^a-zA-Z0-9_:\.\-]/gim;t.parseTag=function(e,t,n){var a="",i=0,s=!1,l=!1,c=0,u=e.length,p="",f="";for(c=0;c"===d){a+=n(e.slice(i,s)),p=r(f=e.slice(s,c+1)),a+=t(s,a.length,p,f,o(f)),i=c+1,s=!1;continue}if(('"'===d||"'"===d)&&"="===e.charAt(c-1)){l=d;continue}}else if(d===l){l=!1;continue}}return i-1},get:function(n){return t[e.indexOf(n)]},set:function(n,r){-1===e.indexOf(n)&&(e.push(n),t.push(r))},delete:function(n){var r=e.indexOf(n);r>-1&&(e.splice(r,1),t.splice(r,1))}}}(),i=function(e){return new Event(e,{bubbles:!0})};try{new Event("test")}catch(e){i=function(e){var t=document.createEvent("Event");return t.initEvent(e,!0,!1),t}}var s=null;"undefined"==typeof window||"function"!=typeof window.getComputedStyle?((s=function(e){return e}).destroy=function(e){return e},s.update=function(e){return e}):((s=function(e,t){return e&&Array.prototype.forEach.call(e.length?e:[e],(function(e){return n(e)})),e}).destroy=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],r),e},s.update=function(e){return e&&Array.prototype.forEach.call(e.length?e:[e],o),e}),t.default=s,e.exports=t.default},void 0!==(a="function"==typeof r?r.apply(t,o):r)&&(e.exports=a)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return!!e&&this.init(e),this}function a(e){return new o(e)}var i=r(n(26)),s=r(n(17)),l=r(n(20)),c=r(n(6)),u=n(2),p=r(n(24)),f=r(n(0)),d=r(n(22)),h=r(n(19)),v=n(23),g=r(n(25)),m=r(n(21)),y={comment:"",nick:"",mail:"",link:"",ua:f.default.ua,url:"",QQAvatar:""},b="",w={cdn:"https://gravatar.loli.net/avatar/",ds:["mp","identicon","monsterid","wavatar","robohash","retro",""],params:"",hide:!1};o.prototype.init=function(e){if("undefined"==typeof document)throw new Error("Sorry, Valine does not support Server-side rendering.");var t=this;return e&&(e=f.default.extend(u.defaultConfig,e),t.i18n=(0,l.default)(e.lang||f.default.lang,e.langMode),t.config=e,c.default.maps=!!e.emojiMaps&&e.emojiMaps||c.default.maps,c.default.cdn=!!e.emojiCDN&&e.emojiCDN||c.default.cdn,t._init()),t},o.prototype._init=function(){var e=this;try{var t=e.config,n=t.avatar,r=t.avatarForce,o=t.avatar_cdn,a=t.visitor,i=t.path,s=void 0===i?location.pathname:i,l=t.pageSize,c=t.recordIP;e.config.path=s.replace(/index\.html?$/,"");var p=w.ds,d=r?"&q="+u.RandomStr:"";w.params="?d="+(p.indexOf(n)>-1?n:"mp")+"&v="+u.VERSION+d,w.hide="hide"===n,w.cdn=/^https?\:\/\//.test(o)?o:w.cdn,e.config.pageSize=isNaN(l)||l<1?10:l,c&&(0,v.recordIPFn)((function(e){return y.ip=e}));var g=e.config.el||null,b=(0,f.default)(g);if(g=g instanceof HTMLElement?g:b[b.length-1]||null){e.$el=(0,f.default)(g),e.$el.addClass("v").attr("data-class","v"),w.hide&&e.$el.addClass("hide-avatar"),e.config.meta=(e.config.guest_info||e.config.meta||u.defaultMeta).filter((function(e){return u.defaultMeta.indexOf(e)>-1})),e.config.requiredFields=e.config.requiredFields.filter((function(e){return u.defaultMeta.indexOf(e)>-1}));var x=(0==e.config.meta.length?u.defaultMeta:e.config.meta).map((function(t){var n="mail"==t?"email":"text";return u.defaultMeta.indexOf(t)>-1?'':""})),k='
'+x.join("")+'
Powered By Valine
v'+u.VERSION+"
";e.$el.html(k),e.$el.find(".cancel-reply").on("click",(function(t){e.reset()}));var S=e.$el.find(".vempty");e.$nodata={show:function(t){return S.html(t||e.i18n.t("sofa")).show(),e},hide:function(){return S.hide(),e}};var C=e.$el.find(".vload-bottom"),O=e.$el.find(".vload-top");e.$loading={show:function(t){return t&&O.show()||C.show(),e.$nodata.hide(),e},hide:function(){return O.hide(),C.hide(),0===e.$el.find(".vcard").length&&e.$nodata.show(),e}}}(0,h.default)(e.config,(function(t){var n=(0,f.default)(".valine-comment-count"),r=0;!function t(n){var o=n[r++];if(o){var a=(0,f.default)(o).attr("data-xid");a&&e.Q(a).count().then((function(e){o.innerText=e,t(n)})).catch((function(e){o.innerText=0}))}}(n),a&&_.add(AV.Object.extend("Counter"),e.config.path),e.$el&&e.bind()}))}catch(t){(0,m.default)(e,t,"init")}};var x=function(e,t){var n=new e,r=new AV.ACL;r.setPublicReadAccess(!0),r.setPublicWriteAccess(!0),n.setACL(r),n.set("url",t.url),n.set("xid",t.xid),n.set("title",t.title),n.set("time",1),n.save().then((function(e){(0,f.default)(t.el).find(".leancloud-visitors-count").text(1)})).catch((function(e){}))},_={add:function(e,t){var n=this,r=(0,f.default)(".leancloud_visitors,.leancloud-visitors");if(1===r.length){var o=r[0],a=decodeURI((0,f.default)(o).attr("id")),i=(0,f.default)(o).attr("data-flag-title"),s=encodeURI(a),l={el:o,url:a,xid:s,title:i};if(decodeURI(a)===decodeURI(t)){var c=new AV.Query(e);c.equalTo("url",a),c.find().then((function(t){if(t.length>0){var n=t[0];n.increment("time"),n.save().then((function(e){(0,f.default)(o).find(".leancloud-visitors-count").text(e.get("time"))})).catch((function(e){}))}else x(e,l)})).catch((function(t){101==t.code?x(e,l):(0,m.default)(n,t)}))}else _.show(e,r)}else _.show(e,r)},show:function(e,t){var n=[];if(t.forEach((function(e){var t=(0,f.default)(e).find(".leancloud-visitors-count");t&&t.text("0"),n.push(/\%/.test((0,f.default)(e).attr("id"))?decodeURI((0,f.default)(e).attr("id")):(0,f.default)(e).attr("id"))})),n.length){var r=new AV.Query(e);r.containedIn("url",n),r.find().then((function(e){e.length>0&&t.forEach((function(t){e.forEach((function(e){var n=e.get("xid")||encodeURI(e.get("url")),r=e.get("time"),o=(0,f.default)(t),a=o.attr("id");if((/\%/.test(a)?a:encodeURI(a))==n){var i=o.find(".leancloud-visitors-count");i&&i.text(r)}}))}))})).catch((function(e){}))}}};o.prototype.Q=function(e){var t=this,n=arguments.length,r=t.config.clazzName;if(1==n){var o=new AV.Query(r);o.doesNotExist("rid");var a=new AV.Query(r);a.equalTo("rid","");var i=AV.Query.or(o,a);return"*"===e?i.exists("url"):i.equalTo("url",decodeURI(e)),i.addDescending("createdAt"),i.addDescending("insertedAt"),i}var s=JSON.stringify(arguments[1]).replace(/(\[|\])/g,""),l="select * from "+r+" where rid in ("+s+") order by -createdAt,-createdAt";return AV.Query.doCloudQuery(l)},o.prototype.installLocale=function(e,t){return this.i18n(e,t),this},o.prototype.setPath=function(e){return this.config.path=e,this},o.prototype.bind=function(){var e=this,t=e.$el.find(".vemojis"),n=e.$el.find(".vpreview"),r=e.$el.find(".vemoji-btn"),o=e.$el.find(".vpreview-btn"),a=e.$el.find(".veditor"),l=c.default.maps,h=!1;e.$emoji={show:function(){return!h&&function(e){var n=[];for(var r in l)l.hasOwnProperty(r)&&c.default.build(r)&&n.push(''+c.default.build(r)+"");t.html(n.join("")),h=!0,t.find("i").on("click",(function(e){e.preventDefault(),O(a[0]," :"+(0,f.default)(this).attr("title")+":")}))}(),e.$preview.hide(),t.show(),r.addClass("actived"),e.$emoji},hide:function(){return r.removeClass("actived"),t.hide(),e.$emoji}},e.$preview={show:function(){return b?(e.$emoji.hide(),o.addClass("actived"),n.html(b).show(),L()):e.$preview.hide(),e.$preview},hide:function(){return o.removeClass("actived"),n.hide().html(""),e.$preview}};var x=function(t){var r=(0,d.default)(t.val()||"");r||e.$preview.hide(),b!=r&&(b=r,o.hasClass("actived")>-1&&b!=n.html()&&n.html(b),(0,s.default)(t[0]),L())};r.on("click",(function(t){r.hasClass("actived")?e.$emoji.hide():e.$emoji.show()})),o.on("click",(function(t){o.hasClass("actived")?e.$preview.hide():e.$preview.show()}));var _=e.config.meta,k={},S={veditor:"comment"};for(var C in _.forEach((function(e){S["v"+e]=e})),S)S.hasOwnProperty(C)&&function(){var t=S[C],n=e.$el.find("."+C);k[t]=n,n.on("input change blur propertychange",(function(r){e.config.enableQQ&&"blur"===r.type&&"nick"===t&&(isNaN(n.val())?f.default.store.get(u.QQCacheKey)&&f.default.store.get(u.QQCacheKey).nick!=n.val()&&(f.default.store.remove(u.QQCacheKey),y.nick=n.val(),y.mail="",y.QQAvatar=""):(0,v.fetchQQFn)(n.val(),(function(e){var t=e.nick||n.val(),r=e.qq+"@qq.com";(0,f.default)(".vnick").val(t),(0,f.default)(".vmail").val(r),y.nick=t,y.mail=r,y.QQAvatar=e.pic}))),"comment"===t?x(n):y[t]=f.default.escape(n.val().replace(/(^\s*)|(\s*$)/g,"")).substring(0,40)}))}();var O=function(e,t){if(document.selection)e.focus(),document.selection.createRange().text=t,e.focus();else if(e.selectionStart||"0"==e.selectionStart){var n=e.selectionStart,r=e.selectionEnd,o=e.scrollTop;e.value=e.value.substring(0,n)+t+e.value.substring(r,e.value.length),e.focus(),e.selectionStart=n+t.length,e.selectionEnd=n+t.length,e.scrollTop=o}else e.focus(),e.value+=t;setTimeout((function(t){x((0,f.default)(e))}),100)},T={no:1,size:e.config.pageSize,skip:e.config.pageSize},A=e.$el.find(".vpage");A.on("click",(function(e){A.hide(),T.no++,$()}));var $=function(){var t=T.size,n=T.no,r=Number(e.$el.find(".vnum").text());e.$loading.show();var o=e.Q(e.config.path);o.limit(t),o.skip((n-1)*t),o.find().then((function(o){if(T.skip=T.size,o&&o.length){var a=[];o.forEach((function(t){a.push(t.id),j(t,e.$el.find(".vcards"),!0)})),e.Q(e.config.path,a).then((function(e){(e&&e.results||[]).forEach((function(e){j(e,(0,f.default)('.vquote[data-self-id="'+e.get("rid")+'"]'))})).catch((function(e){}))})),t*n0?(e.$el.find(".vcount").show().find(".vnum").text(t),$()):e.$loading.hide()})).catch((function(t){(0,m.default)(e,t,"count")}));var j=function(t,n,r){var o=(0,f.default)('
'),a=t.get("ua"),s="";a&&!/ja/.test(e.config.lang)&&(s=''+(a=f.default.detect(a)).browser+" "+a.version+' '+a.os+" "+a.osVersion+""),"*"===e.config.path&&(s=''+t.get("url")+"");var l=t.get("link")?/^https?\:\/\//.test(t.get("link"))?t.get("link"):"http://"+t.get("link"):"",c=l?''+t.get("nick")+"":''+t.get("nick")+"",u=(w.hide?"":e.config.enableQQ&&t.get("QQAvatar")?'':'')+'
'+c+" "+s+'
'+(0,p.default)(t.get("insertedAt"),e.i18n)+''+e.i18n.t("reply")+'
'+(0,g.default)(t.get("comment"))+'
';o.html(u);var d=o.find(".vat");o.find("a").forEach((function(e){e&&!(0,f.default)(e).hasClass("at")&&(0,f.default)(e).attr({target:"_blank",rel:"nofollow"})})),r?n.append(o):n.prepend(o);var h=o.find(".vcontent");h&&I(h),d&&E(d,t),L()},P={},E=function(t,n){t.on("click",(function(r){var o=t.attr("data-vm-id"),a=t.attr("data-self-id"),i=e.$el.find(".vwrap"),s="@"+f.default.escape(n.get("nick"));(0,f.default)('.vreply-wrapper[data-self-id="'+a+'"]').append(i).find(".cancel-reply").show(),P={at:f.default.escape(s)+" ",rid:o,pid:a,rmail:n.get("mail")},k.comment.attr({placeholder:s})[0].focus()}))},L=function(){setTimeout((function(){try{"MathJax"in window&&"version"in window.MathJax&&(/^3.*/.test(window.MathJax.version)&&MathJax.typeset()||MathJax.Hub.Queue(["Typeset",MathJax.Hub,document.querySelector(".v")])),"renderMathInElement"in window&&renderMathInElement((0,f.default)(".v")[0],{delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1}]})}catch(e){}}),100)},I=function(e){setTimeout((function(){e[0].offsetHeight>200&&(e.addClass("expand"),e.on("click",(function(t){e.removeClass("expand")})))}))};!function(t){if(t=f.default.store.get(u.MetaCacheKey)||t)for(var n in _){var r=_[n];e.$el.find(".v"+r).val(f.default.unescape(t[r])),y[r]=t[r]}var o=f.default.store.get(u.QQCacheKey);y.QQAvatar=e.config.enableQQ&&!!o&&o.pic||""}(),e.reset=function(){y.comment="",k.comment.val(""),x(k.comment),k.comment.attr("placeholder",e.config.placeholder),P={},e.$preview.hide(),e.$el.find(".vpanel").append(e.$el.find(".vwrap")),e.$el.find(".cancel-reply").hide(),b=""};var M=e.$el.find(".vsubmit"),R=function(t){if(e.config.requiredFields.indexOf("nick")>-1&&y.nick.length<3)return k.nick[0].focus(),void e.$el.find(".status-bar").text(""+e.i18n.t("nickFail")).empty(3e3);if(e.config.requiredFields.indexOf("mail")>-1&&!/[\w-\.]+@([\w-]+\.)+[a-z]{2,3}/.test(y.mail))return k.mail[0].focus(),void e.$el.find(".status-bar").text(""+e.i18n.t("mailFail")).empty(3e3);if(""!=b){y.comment=b,y.nick=y.nick||"Anonymous";var n=f.default.store.get("vlx");n&&Date.now()/1e3-n/1e3<20?e.$el.find(".status-bar").text(e.i18n.t("busy")).empty(3e3):D()}else k.comment[0].focus()},D=function(){f.default.store.set("vlx",Date.now()),M.attr({disabled:!0}),e.$loading.show(!0);var t=new(AV.Object.extend(e.config.clazzName||"Comment"));if(y.url=decodeURI(e.config.path),y.insertedAt=new Date,P.rid){var n=P.pid||P.rid;t.set("rid",P.rid),t.set("pid",n),y.comment=b.replace("

",'

'+P.at+" , ")}for(var r in y)if(y.hasOwnProperty(r)){var o=y[r];t.set(r,o)}t.setACL(function(){var e=new AV.ACL;return e.setPublicReadAccess(!0),e.setPublicWriteAccess(!1),e}()),t.save().then((function(t){"Anonymous"!=y.nick&&f.default.store.set(u.MetaCacheKey,{nick:y.nick,link:y.link,mail:y.mail});var n=e.$el.find(".vnum");try{P.rid?j(t,(0,f.default)('.vquote[data-self-id="'+P.rid+'"]'),!0):(Number(n.text())?n.text(Number(n.text())+1):e.$el.find(".vcount").show().find(".vnum").text(Number(n.text())+1),j(t,e.$el.find(".vcards")),T.skip++),M.removeAttr("disabled"),e.$loading.hide(),e.reset()}catch(t){(0,m.default)(e,t,"save")}})).catch((function(t){(0,m.default)(e,t,"commitEvt")}))};M.on("click",R),(0,f.default)(document).on("keydown",(function(e){var t=(e=event||e).keyCode||e.which||e.charCode;(e.ctrlKey||e.metaKey)&&13===t&&R(),9===t&&"veditor"==(document.activeElement.id||"")&&(e.preventDefault(),O(a[0]," "))})).on("paste",(function(e){var t="clipboardData"in e?e.clipboardData:e.originalEvent&&e.originalEvent.clipboardData||window.clipboardData;t&&N(t.items,!0)})),a.on("dragenter dragleave dragover drop",(function(e){e.stopPropagation(),e.preventDefault(),"drop"===e.type&&N(e.dataTransfer.items)}));var N=function(e,t){for(var n=[],r=0,o=e.length;r]+>/g,""))}));else if(-1!==i.type.indexOf("image")){n.push(i.getAsFile());continue}}F(n)},F=function t(n,r){r=r||0;var o=n.length;if(o>0){var i=n[r];M.attr({disabled:!0});var l="![Uploading "+i.name+"...]()";O(a[0],l),z(i,(function(c){500!=c.code?(a.val(a.val().replace(l,"!["+i.name+"]("+c.data.url+")\r\n")),(0,s.default)(a[0]),++r2?o=!!AV.applicationId&&!!AV.applicationKey:r.default.deleteInWin("AV",0)}o?t&&t():r.default.sdkLoader("//cdn.jsdelivr.net/npm/leancloud-storage@3/dist/av-min.js","AV",(function(n){var r,a="https://",i=e.app_id||e.appId,s=e.app_key||e.appKey;if(!e.serverURLs)switch(i.slice(-9)){case"-9Nh9j0Va":a+="tab.";break;case"-MdYXbMMI":a+="us."}r=e.serverURLs||a+"avoscloud.com",AV.init({appId:i,appKey:s,serverURLs:r}),o=!0,t&&t()}))}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=r(n(37)),a=r(n(56)),i=r(n(57)),s=r(n(54)),l=r(n(55)),c={zh:a.default,"zh-cn":a.default,"zh-CN":a.default,"zh-TW":i.default,en:s.default,"en-US":s.default,ja:l.default,"ja-JP":l.default};t.default=function(e,t){return!c[e]&&e&&t&&(c[e]=t),new o.default({phrases:c[e||"zh"],locale:e})}},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){if(e.$el&&e.$loading.hide().$nodata.hide(),"[object Error]"==={}.toString.call(t)){var n=t.code||t.message||t.error||"";if(isNaN(n))e.$el&&e.$nodata.show('

 '+JSON.stringify(t)+"
");else{var r=e.i18n.t("code-"+n),o=(r=="code-"+n?void 0:r)||t.message||t.error||"";101==n||-1==n?e.$nodata.show():e.$el&&e.$nodata.show('
Code '+n+": "+o+"
")}}else e.$el&&e.$nodata.show('
'+JSON.stringify(t)+"
")}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=n(36),a=r(o),i=r(n(0)),s=r(n(6)),l=n(33),c=new o.Renderer;c.code=function(e,t){return'
'+(t&&hljs.getLanguage(t)?hljs.highlight(t,e).value:i.default.escape(e))+"
"},a.default.setOptions({renderer:"hljs"in window?c:new o.Renderer,highlight:function(e,t){return"hljs"in window?t&&hljs.getLanguage(t)&&hljs.highlight(t,e,!0).value||hljs.highlightAuto(e).value:l(e)},gfm:!0,tables:!0,breaks:!0,pedantic:!1,sanitize:!0,smartLists:!0,smartypants:!0,headerPrefi:"v-"}),t.default=function(e){return s.default.parse((0,a.default)(e))}},function(e,t,n){"use strict";t.__esModule=!0,t.recordIPFn=t.fetchQQFn=void 0;var r=function(e){return e&&e.__esModule?e:{default:e}}(n(0)),o=n(2);t.fetchQQFn=function(e,t){var n=r.default.store.get(o.QQCacheKey);n&&n.qq==e?t&&t(n):r.default.ajax({type:"POST",url:"//valine.api.ioliu.cn/getqqinfo",data:{qq:e},success:function(e){e.errmsg||(r.default.store.set(o.QQCacheKey,e),t&&t(e))}})},t.recordIPFn=function(e){r.default.sdkLoader("//api.ip.sb/jsonip?callback=getIP","getIP"),window.getIP=function(t){e&&e(t.ip),r.default.deleteInWin("getIP")}}},function(e,t,n){"use strict";var r=function(e){var t=a(e.getDate(),2),n=a(e.getMonth()+1,2);return a(e.getFullYear(),2)+"-"+n+"-"+t},o=function e(t){return t instanceof Date?t:!isNaN(t)||/^\d+$/.test(t)?new Date(parseInt(t)):/GMT/.test(t||"")?e(new Date(t).getTime()):(t=(t||"").replace(/(^\s*)|(\s*$)/g,"").replace(/\.\d+/,"").replace(/-/,"/").replace(/-/,"/").replace(/(\d)T(\d)/,"$1 $2").replace(/Z/," UTC").replace(/([+-]\d\d):?(\d\d)/," $1$2"),new Date(t))},a=function(e,t){for(var n=e.toString();n.length/gi,"")};var o=function(e,t,n,o){if(/code|pre|span/gi.test(e)){if("style"==t)return t+'="'+(/^color/gi.test(n)?n:"").replace(/(color:[#0-9a-fA-F]{1,6};?).+/gi,"$1")+'"';if("class"==t)return t+"='"+r.default.escapeAttrValue(n)+"'"}if("img"===e&&["src","class"].indexOf(t)>-1)return t+'="'+r.default.escapeAttrValue(n)+'" referrerPolicy="no-referrer" '}},function(e,t,n){var r;!function(o){"use strict";function a(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function i(e,t,n,r,o,i){return a(function(e,t){return e<>>32-t}(a(a(t,e),a(r,i)),o),n)}function s(e,t,n,r,o,a,s){return i(t&n|~t&r,e,t,o,a,s)}function l(e,t,n,r,o,a,s){return i(t&r|n&~r,e,t,o,a,s)}function c(e,t,n,r,o,a,s){return i(t^n^r,e,t,o,a,s)}function u(e,t,n,r,o,a,s){return i(n^(t|~r),e,t,o,a,s)}function p(e,t){e[t>>5]|=128<>>9<<4)]=t;var n,r,o,i,p,f=1732584193,d=-271733879,h=-1732584194,v=271733878;for(n=0;n>5]>>>t%32&255);return n}function d(e){var t,n=[];for(n[(e.length>>2)-1]=void 0,t=0;t>5]|=(255&e.charCodeAt(t/8))<>>4&15)+r.charAt(15&t);return o}function v(e){return unescape(encodeURIComponent(e))}function g(e){return function(e){return f(p(d(e),8*e.length))}(v(e))}function m(e,t){return function(e,t){var n,r,o=d(e),a=[],i=[];for(a[15]=i[15]=void 0,o.length>16&&(o=p(o,8*e.length)),n=0;n<16;n+=1)a[n]=909522486^o[n],i[n]=1549556828^o[n];return r=p(a.concat(d(t)),512+8*t.length),f(p(i.concat(r),640))}(v(e),v(t))}function y(e,t,n){return t?n?m(t,e):function(e,t){return h(m(e,t))}(t,e):n?g(e):function(e){return h(g(e))}(e)}void 0!==(r=function(){return y}.call(t,n,t,e))&&(e.exports=r)}()},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e){var t={},n={Trident:(e=e||navigator.userAgent).indexOf("Trident")>-1||e.indexOf("NET CLR")>-1,Presto:e.indexOf("Presto")>-1,WebKit:e.indexOf("AppleWebKit")>-1,Gecko:e.indexOf("Gecko/")>-1,Safari:e.indexOf("Safari")>-1,Edge:e.indexOf("Edge")>-1||e.indexOf("Edg")>-1,Chrome:e.indexOf("Chrome")>-1||e.indexOf("CriOS")>-1,IE:e.indexOf("MSIE")>-1||e.indexOf("Trident")>-1,Firefox:e.indexOf("Firefox")>-1||e.indexOf("FxiOS")>-1,"Firefox Focus":e.indexOf("Focus")>-1,Chromium:e.indexOf("Chromium")>-1,Opera:e.indexOf("Opera")>-1||e.indexOf("OPR")>-1,Vivaldi:e.indexOf("Vivaldi")>-1,Yandex:e.indexOf("YaBrowser")>-1,Kindle:e.indexOf("Kindle")>-1||e.indexOf("Silk/")>-1,360:e.indexOf("360EE")>-1||e.indexOf("360SE")>-1,UC:e.indexOf("UC")>-1||e.indexOf(" UBrowser")>-1,QQBrowser:e.indexOf("QQBrowser")>-1,QQ:e.indexOf("QQ/")>-1,Baidu:e.indexOf("Baidu")>-1||e.indexOf("BIDUBrowser")>-1,Maxthon:e.indexOf("Maxthon")>-1,Sogou:e.indexOf("MetaSr")>-1||e.indexOf("Sogou")>-1,LBBROWSER:e.indexOf("LBBROWSER")>-1,"2345Explorer":e.indexOf("2345Explorer")>-1,TheWorld:e.indexOf("TheWorld")>-1,XiaoMi:e.indexOf("MiuiBrowser")>-1,Quark:e.indexOf("Quark")>-1,Qiyu:e.indexOf("Qiyu")>-1,Wechat:e.indexOf("MicroMessenger")>-1,Taobao:e.indexOf("AliApp(TB")>-1,Alipay:e.indexOf("AliApp(AP")>-1,Weibo:e.indexOf("Weibo")>-1,Douban:e.indexOf("com.douban.frodo")>-1,Suning:e.indexOf("SNEBUY-APP")>-1,iQiYi:e.indexOf("IqiyiApp")>-1,Windows:e.indexOf("Windows")>-1,Linux:e.indexOf("Linux")>-1||e.indexOf("X11")>-1,macOS:e.indexOf("Macintosh")>-1,Android:e.indexOf("Android")>-1||e.indexOf("Adr")>-1,Ubuntu:e.indexOf("Ubuntu")>-1,FreeBSD:e.indexOf("FreeBSD")>-1,Debian:e.indexOf("Debian")>-1,"Windows Phone":e.indexOf("IEMobile")>-1||e.indexOf("Windows Phone")>-1,BlackBerry:e.indexOf("BlackBerry")>-1||e.indexOf("RIM")>-1||e.indexOf("BB10")>-1,MeeGo:e.indexOf("MeeGo")>-1,Symbian:e.indexOf("Symbian")>-1,iOS:e.indexOf("like Mac OS X")>-1,"Chrome OS":e.indexOf("CrOS")>-1,WebOS:e.indexOf("hpwOS")>-1,Mobile:e.indexOf("Mobi")>-1||e.indexOf("iPh")>-1||e.indexOf("480")>-1,Tablet:e.indexOf("Tablet")>-1||e.indexOf("Pad")>-1||e.indexOf("Nexus 7")>-1};n.Mobile&&(n.Mobile=!(e.indexOf("iPad")>-1));var r={browser:["Safari","Chrome","Edge","IE","Firefox","Firefox Focus","Chromium","Opera","Vivaldi","Yandex","Kindle","360","UC","QQBrowser","QQ","Baidu","Maxthon","Sogou","LBBROWSER","2345Explorer","TheWorld","XiaoMi","Quark","Qiyu","Wechat","Taobao","Alipay","Weibo","Douban","Suning","iQiYi"],os:["Windows","Linux","Mac OS","macOS","Android","Ubuntu","FreeBSD","Debian","iOS","Windows Phone","BlackBerry","MeeGo","Symbian","Chrome OS","WebOS"]};for(var o in r)if(r.hasOwnProperty(o))for(var a=0,i=r[o].length;a=3&&(a=n),"[object Array]"===o.call(e)?i(e,t,a):"string"==typeof e?s(e,t,a):l(e,t,a)}},function(e,t,n){"use strict";var r=Array.prototype.slice,o=Object.prototype.toString;e.exports=function(e){var t=this;if("function"!=typeof t||"[object Function]"!==o.call(t))throw new TypeError("Function.prototype.bind called on incompatible "+t);for(var n,a=r.call(arguments,1),i=function(){if(this instanceof n){var o=t.apply(this,a.concat(r.call(arguments)));return Object(o)===o?o:this}return t.apply(e,a.concat(r.call(arguments)))},s=Math.max(0,t.length-a.length),l=[],c=0;c'+e+""}(n);if("<"===t)return"<";var r;i[t]?r=i[t]:(r=o[a],i[t]=r);var s=''+t+"";return a=++a%o.length,s}))}}()},function(e,t,n){"use strict";var r=n(4);e.exports=r.call(Function.call,Object.prototype.hasOwnProperty)},function(e,t,n){"use strict";var r=Function.prototype.toString,o=/^\s*class\b/,a=function(e){try{var t=r.call(e);return o.test(t)}catch(e){return!1}},i=Object.prototype.toString,s="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;e.exports=function(e){if(!e)return!1;if("function"!=typeof e&&"object"!=typeof e)return!1;if("function"==typeof e&&!e.prototype)return!0;if(s)return function(e){try{return!a(e)&&(r.call(e),!0)}catch(e){return!1}}(e);if(a(e))return!1;var t=i.call(e);return"[object Function]"===t||"[object GeneratorFunction]"===t}},function(e,t,n){(function(t){!function(t){"use strict";function n(e){this.tokens=[],this.tokens.links={},this.options=e||h.defaults,this.rules=v.normal,this.options.pedantic?this.rules=v.pedantic:this.options.gfm&&(this.options.tables?this.rules=v.tables:this.rules=v.gfm)}function r(e,t){if(this.options=t||h.defaults,this.links=e,this.rules=g.normal,this.renderer=this.options.renderer||new o,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.pedantic?this.rules=g.pedantic:this.options.gfm&&(this.options.breaks?this.rules=g.breaks:this.rules=g.gfm)}function o(e){this.options=e||h.defaults}function a(){}function i(e){this.tokens=[],this.token=null,this.options=e||h.defaults,this.options.renderer=this.options.renderer||new o,this.renderer=this.options.renderer,this.renderer.options=this.options}function s(e,t){return e.replace(t?/&/g:/&(?!#?\w+;)/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function l(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,(function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""}))}function c(e,t){return e=e.source||e,t=t||"",{replace:function(t,n){return n=(n=n.source||n).replace(/(^|[^\[])\^/g,"$1"),e=e.replace(t,n),this},getRegex:function(){return new RegExp(e,t)}}}function u(e,t){return m[" "+e]||(/^[^:]+:\/*[^/]*$/.test(e)?m[" "+e]=e+"/":m[" "+e]=e.replace(/[^/]*$/,"")),e=m[" "+e],"//"===t.slice(0,2)?e.replace(/:[\s\S]*/,":")+t:"/"===t.charAt(0)?e.replace(/(:\/*[^/]*)[\s\S]*/,"$1")+t:e+t}function p(){}function f(e){for(var t,n,r=1;rt)n.splice(t);else for(;n.lengthAn error occurred:

"+s(e.message+"",!0)+"
";throw e}}var v={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:p,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,nptable:p,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|\\n*|\\n*|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)|(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:p,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};v.def=c(v.def).replace("label",v._label).replace("title",v._title).getRegex(),v.bullet=/(?:[*+-]|\d+\.)/,v.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,v.item=c(v.item,"gm").replace(/bull/g,v.bullet).getRegex(),v.list=c(v.list).replace(/bull/g,v.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+v.def.source+")").getRegex(),v._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",v._comment=//,v.html=c(v.html,"i").replace("comment",v._comment).replace("tag",v._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),v.paragraph=c(v.paragraph).replace("hr",v.hr).replace("heading",v.heading).replace("lheading",v.lheading).replace("tag",v._tag).getRegex(),v.blockquote=c(v.blockquote).replace("paragraph",v.paragraph).getRegex(),v.normal=f({},v),v.gfm=f({},v.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),v.gfm.paragraph=c(v.paragraph).replace("(?!","(?!"+v.gfm.fences.source.replace("\\1","\\2")+"|"+v.list.source.replace("\\1","\\3")+"|").getRegex(),v.tables=f({},v.gfm,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),v.pedantic=f({},v.normal,{html:c("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",v._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/}),n.rules=v,n.lex=function(e,t){return new n(t).lex(e)},n.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},n.prototype.token=function(e,t){e=e.replace(/^ +$/gm,"");for(var n,r,o,a,i,s,l,c,u,p,f,h,g;e;)if((o=this.rules.newline.exec(e))&&(e=e.substring(o[0].length),o[0].length>1&&this.tokens.push({type:"space"})),o=this.rules.code.exec(e))e=e.substring(o[0].length),o=o[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?o:o.replace(/\n+$/,"")});else if(o=this.rules.fences.exec(e))e=e.substring(o[0].length),this.tokens.push({type:"code",lang:o[2],text:o[3]||""});else if(o=this.rules.heading.exec(e))e=e.substring(o[0].length),this.tokens.push({type:"heading",depth:o[1].length,text:o[2]});else if(t&&(o=this.rules.nptable.exec(e))&&(s={type:"table",header:d(o[1].replace(/^ *| *\| *$/g,"")),align:o[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:o[3]?o[3].replace(/\n$/,"").split("\n"):[]}).header.length===s.align.length){for(e=e.substring(o[0].length),c=0;c ?/gm,""),this.token(o,t),this.tokens.push({type:"blockquote_end"});else if(o=this.rules.list.exec(e)){for(e=e.substring(o[0].length),f=(a=o[2]).length>1,this.tokens.push({type:"list_start",ordered:f,start:f?+a:""}),n=!1,p=(o=o[0].match(this.rules.item)).length,c=0;c1&&i.length>1||(e=o.slice(c+1).join("\n")+e,c=p-1)),r=n||/\n\n(?!\s*$)/.test(s),c!==p-1&&(n="\n"===s.charAt(s.length-1),r||(r=n)),g=void 0,(h=/^\[[ xX]\] /.test(s))&&(g=" "!==s[1],s=s.replace(/^\[[ xX]\] +/,"")),this.tokens.push({type:r?"loose_item_start":"list_item_start",task:h,checked:g}),this.token(s,!1),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(o=this.rules.html.exec(e))e=e.substring(o[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===o[1]||"script"===o[1]||"style"===o[1]),text:o[0]});else if(t&&(o=this.rules.def.exec(e)))e=e.substring(o[0].length),o[3]&&(o[3]=o[3].substring(1,o[3].length-1)),u=o[1].toLowerCase().replace(/\s+/g," "),this.tokens.links[u]||(this.tokens.links[u]={href:o[2],title:o[3]});else if(t&&(o=this.rules.table.exec(e))&&(s={type:"table",header:d(o[1].replace(/^ *| *\| *$/g,"")),align:o[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:o[3]?o[3].replace(/(?: *\| *)?\n$/,"").split("\n"):[]}).header.length===s.align.length){for(e=e.substring(o[0].length),c=0;c?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:p,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)|^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)/,em:/^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*][\s\S]*?[^\s])\*(?!\*)|^_([^\s_])_(?!_)|^\*([^\s*])\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:p,text:/^[\s\S]+?(?=[\\?@\[\]\\^_`{|}~])/g,_scheme:/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,_email:/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/};g.autolink=c(g.autolink).replace("scheme",g._scheme).replace("email",g._email).getRegex(),g._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,g.tag=c(g.tag).replace("comment",v._comment).replace("attribute",g._attribute).getRegex(),g._label=/(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/,g._href=/\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f()\\]*\)|[^\s\x00-\x1f()\\])*?)/,g._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,g.link=c(g.link).replace("label",g._label).replace("href",g._href).replace("title",g._title).getRegex(),g.reflink=c(g.reflink).replace("label",g._label).getRegex(),g.normal=f({},g),g.pedantic=f({},g.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:c(/^!?\[(label)\]\((.*?)\)/).replace("label",g._label).getRegex(),reflink:c(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",g._label).getRegex()}),g.gfm=f({},g.normal,{escape:c(g.escape).replace("])","~|])").getRegex(),url:c(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("email",g._email).getRegex(),_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:c(g.text).replace("]|","~]|").replace("|","|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\|}~-]+@|").getRegex()}),g.breaks=f({},g.gfm,{br:c(g.br).replace("{2,}","*").getRegex(),text:c(g.gfm.text).replace("{2,}","*").getRegex()}),r.rules=g,r.output=function(e,t,n){return new r(t,n).output(e)},r.prototype.output=function(e){for(var t,n,o,a,i,l="";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),l+=i[1];else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),o="@"===i[2]?"mailto:"+(n=s(this.mangle(i[1]))):n=s(i[1]),l+=this.renderer.link(o,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.tag.exec(e))!this.inLink&&/^/i.test(i[0])&&(this.inLink=!1),e=e.substring(i[0].length),l+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):s(i[0]):i[0];else if(i=this.rules.link.exec(e))e=e.substring(i[0].length),this.inLink=!0,o=i[2],this.options.pedantic?(t=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(o))?(o=t[1],a=t[3]):a="":a=i[3]?i[3].slice(1,-1):"",o=o.trim().replace(/^<([\s\S]*)>$/,"$1"),l+=this.outputLink(i,{href:r.escapes(o),title:r.escapes(a)}),this.inLink=!1;else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),!(t=this.links[t.toLowerCase()])||!t.href){l+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,l+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),l+=this.renderer.strong(this.output(i[4]||i[3]||i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),l+=this.renderer.em(this.output(i[6]||i[5]||i[4]||i[3]||i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),l+=this.renderer.codespan(s(i[2].trim(),!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),l+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),l+=this.renderer.del(this.output(i[1]));else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),l+=this.renderer.text(s(this.smartypants(i[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else i[0]=this.rules._backpedal.exec(i[0])[0],e=e.substring(i[0].length),"@"===i[2]?o="mailto:"+(n=s(i[0])):(n=s(i[0]),o="www."===i[1]?"http://"+n:n),l+=this.renderer.link(o,null,n);return l},r.escapes=function(e){return e?e.replace(r.rules._escapes,"$1"):e},r.prototype.outputLink=function(e,t){var n=t.href,r=t.title?s(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,s(e[1]))},r.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},r.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,o=0;o.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},o.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?'
'+(n?e:s(e,!0))+"
\n":"
"+(n?e:s(e,!0))+"
"},o.prototype.blockquote=function(e){return"
\n"+e+"
\n"},o.prototype.html=function(e){return e},o.prototype.heading=function(e,t,n){return this.options.headerIds?"'+e+"\n":""+e+"\n"},o.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"},o.prototype.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"},o.prototype.listitem=function(e){return"
  • "+e+"
  • \n"},o.prototype.checkbox=function(e){return" "},o.prototype.paragraph=function(e){return"

    "+e+"

    \n"},o.prototype.table=function(e,t){return t&&(t=""+t+""),"\n\n"+e+"\n"+t+"
    \n"},o.prototype.tablerow=function(e){return"\n"+e+"\n"},o.prototype.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"\n"},o.prototype.strong=function(e){return""+e+""},o.prototype.em=function(e){return""+e+""},o.prototype.codespan=function(e){return""+e+""},o.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},o.prototype.del=function(e){return""+e+""},o.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(l(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return n}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:")||0===r.indexOf("data:"))return n}this.options.baseUrl&&!y.test(e)&&(e=u(this.options.baseUrl,e));try{e=encodeURI(e).replace(/%25/g,"%")}catch(e){return n}var o='
    "+n+""},o.prototype.image=function(e,t,n){this.options.baseUrl&&!y.test(e)&&(e=u(this.options.baseUrl,e));var r=''+n+'":">")},o.prototype.text=function(e){return e},a.prototype.strong=a.prototype.em=a.prototype.codespan=a.prototype.del=a.prototype.text=function(e){return e},a.prototype.link=a.prototype.image=function(e,t,n){return""+n},a.prototype.br=function(){return""},i.parse=function(e,t){return new i(t).parse(e)},i.prototype.parse=function(e){this.inline=new r(e.links,this.options),this.inlineText=new r(e.links,f({},this.options,{renderer:new a})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},i.prototype.next=function(){return this.token=this.tokens.pop()},i.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},i.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},i.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,l(this.inlineText.output(this.token.text)));case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,o="",a="";for(n="",e=0;e=12&&t<=14)?1:2},m={pluralTypes:{arabic:function(e){if(e<3)return e;var t=e%100;return t>=3&&t<=10?3:t>=11?4:5},bosnian_serbian:g,chinese:function(){return 0},croatian:g,french:function(e){return e>1?1:0},german:function(e){return 1!==e?1:0},russian:g,lithuanian:function(e){return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?1:2},czech:function(e){return 1===e?0:e>=2&&e<=4?1:2},polish:function(e){if(1===e)return 0;var t=e%10;return 2<=t&&t<=4&&(e%100<10||e%100>=20)?1:2},icelandic:function(e){return e%10!=1||e%100==11?1:0},slovenian:function(e){var t=e%100;return 1===t?0:2===t?1:3===t||4===t?2:3}},pluralTypeToLanguages:{arabic:["ar"],bosnian_serbian:["bs-Latn-BA","bs-Cyrl-BA","srl-RS","sr-RS"],chinese:["id","id-ID","ja","ko","ko-KR","lo","ms","th","th-TH","zh"],croatian:["hr","hr-HR"],german:["fa","da","de","en","es","fi","el","he","hi-IN","hu","hu-HU","it","nl","no","pt","sv","tr"],french:["fr","tl","pt-br"],russian:["ru","ru-RU"],lithuanian:["lt"],czech:["cs","cs-CZ","sk"],polish:["pl"],icelandic:["is"],slovenian:["sl-SL"]}},y=/%\{(.*?)\}/g;s.prototype.locale=function(e){return e&&(this.currentLocale=e),this.currentLocale},s.prototype.extend=function(e,t){l(e,(function(e,n){var r=t?t+"."+n:n;"object"==typeof e?this.extend(e,r):this.phrases[r]=e}),this)},s.prototype.unset=function(e,t){"string"==typeof e?delete this.phrases[e]:l(e,(function(e,n){var r=t?t+"."+n:n;"object"==typeof e?this.unset(e,r):delete this.phrases[r]}),this)},s.prototype.clear=function(){this.phrases={}},s.prototype.replace=function(e){this.clear(),this.extend(e)},s.prototype.t=function(e,t){var n,r,o=null==t?{}:t;return"string"==typeof this.phrases[e]?n=this.phrases[e]:"string"==typeof o._?n=o._:this.onMissingKey?r=(0,this.onMissingKey)(e,o,this.currentLocale,this.tokenRegex,this.pluralRules):(this.warn('Missing translation for key: "'+e+'"'),r=e),"string"==typeof n&&(r=i(n,o,this.currentLocale,this.tokenRegex,this.pluralRules)),r},s.prototype.has=function(e){return u(this.phrases,e)},s.transformPhrase=function(e,t,n){return i(e,t,n)},e.exports=s},function(e,t,n){"use strict";function r(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)} +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/var o=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,l=r(e),c=1;c0&&!o.call(e,0))for(var d=0;d0)for(var v=0;v1)for(var n=1;n + * https://github.com/jaywcjlove/store.js + * + * Licensed under the MIT license. + */ +var c=window.localStorage;c=function(e){var t="_Is_Incognit";try{e.setItem(t,"yes")}catch(t){if("QuotaExceededError"===t.name){var n=function(){};e.__proto__={setItem:n,getItem:n,removeItem:n,clear:n}}}finally{"yes"===e.getItem(t)&&e.removeItem(t)}return e}(c),s.prototype={set:function(e,t){if(e&&!r(e))c.setItem(e,function(e){return void 0===e||"function"==typeof e?e+"":JSON.stringify(e)}(t));else if(r(e))for(var n in e)this.set(n,e[n]);return this},get:function(e){if(!e){var t={};return this.forEach((function(e,n){return t[e]=n})),t}if("?"===e.charAt(0))return this.has(e.substr(1));var n=arguments;if(n.length>1){for(var r={},a=0,i=n.length;a-1&&(n[t[r]]=this.get(t[r]));return n}};var u=null;for(var p in s.prototype)l[p]=s.prototype[p];t.default=l},function(e,t,n){"use strict";var r=n(12),o=n(9),a=n(11),i=n(13),s=n(49),l=r(i());o(l,{getPolyfill:i,implementation:a,shim:s}),e.exports=l},function(e,t,n){"use strict";var r=n(1),o=r("%String%"),a=r("%TypeError%");e.exports=function(e){if("symbol"==typeof e)throw new a("Cannot convert a Symbol value to a string");return o(e)}},function(e,t,n){"use strict";var r=n(1)("%TypeError%");e.exports=function(e,t){if(null==e)throw new r(t||"Cannot call method on "+e);return e}},function(e,t,n){"use strict";var r=n(1),o=n(12),a=o(r("String.prototype.indexOf"));e.exports=function(e,t){var n=r(e,!!t);return"function"==typeof n&&a(e,".prototype.")?o(n):n}},function(e,t,n){"use strict";(function(t){var r=t.Symbol,o=n(48);e.exports=function(){return"function"==typeof r&&"function"==typeof Symbol&&"symbol"==typeof r("foo")&&"symbol"==typeof Symbol("bar")&&o()}}).call(t,n(14))},function(e,t,n){"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),n=Object(t);if("string"==typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var r=Object.getOwnPropertySymbols(e);if(1!==r.length||r[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var o=Object.getOwnPropertyDescriptor(e,t);if(42!==o.value||!0!==o.enumerable)return!1}return!0}},function(e,t,n){"use strict";var r=n(9),o=n(13);e.exports=function(){var e=o();return r(String.prototype,{trim:e},{trim:function(){return String.prototype.trim!==e}}),e}},function(e,t,n){"use strict";(function(t){var n=function(){};if("production"!==t.env.NODE_ENV){var r=function(e,t){var n=arguments.length;t=new Array(n>1?n-1:0);for(var r=1;r2?o-2:0);for(var a=2;a";var y=function(e){var t=u.spaceIndex(e);if(-1===t)return{html:"",closing:"/"===e[e.length-2]};var n="/"===(e=u.trim(e.slice(t+1,-1)))[e.length-1];return n&&(e=u.trim(e.slice(0,-1))),{html:e,closing:n}}(l),b=n[i],w=c(y.html,(function(e,t){var n,o=-1!==u.indexOf(b,e);return r(n=s(i,e,t,o))?o?(t=f(i,e,t,h))?e+'="'+t+'"':e:r(n=p(i,e,t,o))?void 0:n:n}));return l="<"+i,w&&(l+=" "+w),y.closing&&(l+=" /"),l+">"}return r(g=a(i,l,m))?d(l):g}),d);return v&&(g=v.remove(g)),g},e.exports=o},function(e,t){e.exports={smile:"e3/2018new_weixioa02_org.png",lovely:"09/2018new_keai_org.png",happy:"1e/2018new_taikaixin_org.png",clap:"6e/2018new_guzhang_thumb.png",whee:"33/2018new_xixi_thumb.png",haha:"8f/2018new_haha_thumb.png","laugh and cry":"4a/2018new_xiaoku_thumb.png",wink:"43/2018new_jiyan_org.png",greddy:"fa/2018new_chanzui_org.png",awkward:"a3/2018new_heixian_thumb.png",sweat:"28/2018new_han_org.png","pick nose":"9a/2018new_wabi_thumb.png",hum:"7c/2018new_heng_thumb.png",angry:"f6/2018new_nu_thumb.png",grievance:"a5/2018new_weiqu_thumb.png",poor:"96/2018new_kelian_org.png",disappoint:"aa/2018new_shiwang_thumb.png",sad:"ee/2018new_beishang_org.png",tear:"6e/2018new_leimu_org.png","no way":"83/2018new_kuxiao_org.png",shy:"c1/2018new_haixiu_org.png",dirt:"10/2018new_wu_thumb.png","love you":"f6/2018new_aini_org.png",kiss:"2c/2018new_qinqin_thumb.png",amorousness:"9d/2018new_huaxin_org.png",longing:"c9/2018new_chongjing_org.png",desire:"3e/2018new_tianping_thumb.png","bad laugh":"4d/2018new_huaixiao_org.png",blackness:"9e/2018new_yinxian_org.png","laugh without word":"2d/2018new_xiaoerbuyu_org.png",titter:"71/2018new_touxiao_org.png",cool:"c4/2018new_ku_org.png","not easy":"aa/2018new_bingbujiandan_thumb.png",think:"30/2018new_sikao_org.png",question:"b8/2018new_ningwen_org.png","no idea":"2a/2018new_wenhao_thumb.png",dizzy:"07/2018new_yun_thumb.png",bomb:"a2/2018new_shuai_thumb.png",bone:"a1/2018new_kulou_thumb.png","be quiet":"b0/2018new_xu_org.png","shut up":"62/2018new_bizui_org.png",stupid:"dd/2018new_shayan_org.png","surprise ":"49/2018new_chijing_org.png",vomit:"08/2018new_tu_org.png",cold:"40/2018new_kouzhao_thumb.png",sick:"3b/2018new_shengbing_thumb.png",bye:"fd/2018new_baibai_thumb.png","look down on":"da/2018new_bishi_org.png","white eye":"ef/2018new_landelini_org.png","left hum":"43/2018new_zuohengheng_thumb.png","right hum":"c1/2018new_youhengheng_thumb.png",crazy:"17/2018new_zhuakuang_org.png","scold ":"87/2018new_zhouma_thumb.png","hit on face":"cb/2018new_dalian_org.png",wow:"ae/2018new_ding_org.png",fan:"86/2018new_hufen02_org.png",money:"a2/2018new_qian_thumb.png",yawn:"55/2018new_dahaqian_org.png",sleepy:"3c/2018new_kun_thumb.png",sleep:"e2/2018new_shuijiao_thumb.png","watermelon ":"01/2018new_chigua_thumb.png",doge:"a1/2018new_doge02_org.png",dog:"22/2018new_erha_org.png",cat:"7b/2018new_miaomiao_thumb.png",thumb:"e6/2018new_zan_org.png",good:"8a/2018new_good_org.png",ok:"45/2018new_ok_org.png",yeah:"29/2018new_ye_thumb.png","shack hand":"e9/2018new_woshou_thumb.png",bow:"e7/2018new_zuoyi_org.png",come:"42/2018new_guolai_thumb.png",punch:"86/2018new_quantou_thumb.png"}},function(e,t){e.exports={nick:"NickName",mail:"E-Mail",link:"Website(http://)",nickFail:"NickName cannot be less than 3 bytes.",mailFail:"Please confirm your email address.",sofa:"No comment yet.",submit:"Submit",reply:"Reply",cancelReply:"Cancel reply",comments:"Comments",cancel:"Cancel",confirm:"Confirm",continue:"Continue",more:"Load More...",preview:"Preview",emoji:"Emoji",expand:"See more....",seconds:"seconds ago",minutes:"minutes ago",hours:"hours ago",days:"days ago",now:"just now",uploading:"Uploading ...",uploadDone:"Upload completed!",busy:"Submit is busy, please wait...","code-98":"Valine initialization failed, please check your version of av-min.js.","code-99":"Valine initialization failed, Please check the `el` element in the init method.","code-100":"Valine initialization failed, Please check your appId and appKey.","code-140":"The total number of API calls today has exceeded the development version limit.","code-401":"Unauthorized operation, Please check your appId and appKey.","code-403":"Access denied by API domain white list, Please check your security domain."}},function(e,t){e.exports={nick:"ニックネーム",mail:"メールアドレス",link:"サイト(http://)",nickFail:"3バイト以上のニックネームをご入力ください.",mailFail:"メールアドレスをご確認ください.",sofa:"コメントしましょう~",submit:"提出する",reply:"返信する",cancelReply:"キャンセル",comments:"コメント",cancel:"キャンセル",confirm:"確認する",continue:"继续",more:"さらに読み込む...",preview:"プレビュー",emoji:"絵文字",expand:"もっと見る",seconds:"秒前",minutes:"分前",hours:"時間前",days:"日前",now:"たっだ今",uploading:"アップロード中...",uploadDone:"アップロードが完了しました!",busy:"20 秒間隔で提出してください ...","code-98":"ロードエラーです。av-min.js のバージョンを確認してください.","code-99":"ロードエラーです。initにある`el`エレメントを確認ください.","code-100":"ロードエラーです。AppIdとAppKeyを確認ください.","code-140":"今日のAPIコールの総数が開発バージョンの上限を超えた.","code-401":"権限が制限されています。AppIdとAppKeyを確認ください.","code-403":"アクセスがAPIなどに制限されました、ドメイン名のセキュリティ設定を確認ください"}},function(e,t){e.exports={nick:"昵称",mail:"邮箱",link:"网址(http://)",nickFail:"昵称不能少于3个字符",mailFail:"请填写正确的邮件地址",sofa:"来发评论吧~",submit:"提交",reply:"回复",cancelReply:"取消回复",comments:"评论",cancel:"取消",confirm:"确认",continue:"继续",more:"加载更多...",preview:"预览",emoji:"表情",expand:"查看更多...",seconds:"秒前",minutes:"分钟前",hours:"小时前",days:"天前",now:"刚刚",uploading:"正在传输...",uploadDone:"传输完成!",busy:"操作频繁,请稍候再试...","code-98":"Valine 初始化失败,请检查 av-min.js 版本","code-99":"Valine 初始化失败,请检查init中的`el`元素.","code-100":"Valine 初始化失败,请检查你的AppId和AppKey.","code-140":"今日 API 调用总次数已超过开发版限制.","code-401":"未经授权的操作,请检查你的AppId和AppKey.","code-403":"访问被API域名白名单拒绝,请检查你的安全域名设置."}},function(e,t){e.exports={nick:"暱稱",mail:"郵箱",link:"網址(http://)",nickFail:"昵稱不能少於3個字符",mailFail:"請填寫正確的郵件地址",sofa:"來發評論吧~",submit:"提交",reply:"回覆",cancelReply:"取消回覆",comments:"評論",cancel:"取消",confirm:"確認",continue:"繼續",more:"加載更多...",preview:"預覽",emoji:"表情",expand:"查看更多...",seconds:"秒前",minutes:"分鐘前",hours:"小時前",days:"天前",now:"剛剛",uploading:"正在上傳...",uploadDone:"上傳完成!",busy:"操作頻繁,請稍候再試...","code-98":"Valine 初始化失敗,請檢查 av-min.js 版本","code-99":"Valine 初始化失敗,請檢查init中的`el`元素.","code-100":"Valine 初始化失敗,請檢查你的AppId和AppKey.","code-140":"今日 API 調用總次數已超過開發版限制.","code-401":"未經授權的操作,請檢查你的AppId和AppKey.","code-403":"訪問被API域名白名單拒絕,請檢查你的安全域名設置."}},function(e,t,n){var r=n(59);"string"==typeof r&&(r=[[e.i,r,""]]);var o={transform:void 0};n(61)(r,o),r.locals&&(e.exports=r.locals)},function(e,t,n){(e.exports=n(60)(!1)).push([e.i,'.v[data-class=v]{font-size:16px;text-align:left}.v[data-class=v] *{-webkit-box-sizing:border-box;box-sizing:border-box;line-height:1.75}.v[data-class=v] .status-bar,.v[data-class=v] .veditor,.v[data-class=v] .vinput,.v[data-class=v] p,.v[data-class=v] pre code{color:#555}.v[data-class=v] .vsys,.v[data-class=v] .vtime{color:#b3b3b3}.v[data-class=v] .text-right{text-align:right}.v[data-class=v] .text-center{text-align:center}.v[data-class=v] img{max-width:100%;border:none}.v[data-class=v] hr{margin:.825em 0;border-color:#f6f6f6;border-style:dashed}.v[data-class=v].hide-avatar .vimg{display:none}.v[data-class=v] a{position:relative;cursor:pointer;color:#1abc9c;text-decoration:none;display:inline-block}.v[data-class=v] a:hover{color:#d7191a}.v[data-class=v] code,.v[data-class=v] pre{background-color:#f8f8f8;padding:.2em .4em;border-radius:3px;font-size:85%;margin:0}.v[data-class=v] pre{padding:10px;overflow:auto;line-height:1.45}.v[data-class=v] pre code{padding:0;background:transparent;white-space:pre-wrap;word-break:keep-all}.v[data-class=v] blockquote{color:#666;margin:.5em 0;padding:0 0 0 1em;border-left:8px solid hsla(0,0%,93%,.5)}.v[data-class=v] .vinput{border:none;resize:none;outline:none;padding:10px 5px;max-width:100%;font-size:.775em}.v[data-class=v] input[type=checkbox],.v[data-class=v] input[type=radio]{display:inline-block;vertical-align:middle;margin-top:-2px}.v[data-class=v] .vicon{cursor:pointer;display:inline-block;overflow:hidden;fill:#555;vertical-align:middle}.v[data-class=v] .vicon+.vicon{margin-left:10px}.v[data-class=v] .vicon.actived{fill:#66b1ff}.v[data-class=v] .vrow{font-size:0;padding:10px 0}.v[data-class=v] .vrow .vcol{display:inline-block;vertical-align:middle;font-size:14px}.v[data-class=v] .vrow .vcol.vcol-20{width:20%}.v[data-class=v] .vrow .vcol.vcol-30{width:30%}.v[data-class=v] .vrow .vcol.vcol-40{width:40%}.v[data-class=v] .vrow .vcol.vcol-50{width:50%}.v[data-class=v] .vrow .vcol.vcol-60{width:60%}.v[data-class=v] .vrow .vcol.vcol-70{width:70%}.v[data-class=v] .vrow .vcol.vcol-80{width:80%}.v[data-class=v] .vrow .vcol.vctrl{font-size:12px}.v[data-class=v] .emoji,.v[data-class=v] .vemoji{max-width:25px;vertical-align:middle;margin:0 1px;display:inline-block}.v[data-class=v] .vwrap{border:1px solid #f0f0f0;border-radius:4px;margin-bottom:10px;overflow:hidden;position:relative;padding:10px}.v[data-class=v] .vwrap input{background:transparent}.v[data-class=v] .vwrap .vedit{position:relative;padding-top:10px}.v[data-class=v] .vwrap .cancel-reply-btn{position:absolute;right:5px;top:5px;cursor:pointer}.v[data-class=v] .vwrap .vemojis{display:none;font-size:18px;max-height:145px;overflow:auto;padding-bottom:10px;-webkit-box-shadow:0 0 1px #f0f0f0;box-shadow:0 0 1px #f0f0f0}.v[data-class=v] .vwrap .vemojis i{font-style:normal;padding-top:7px;width:36px;cursor:pointer;text-align:center;display:inline-block;vertical-align:middle}.v[data-class=v] .vwrap .vpreview{padding:7px;-webkit-box-shadow:0 0 1px #f0f0f0;box-shadow:0 0 1px #f0f0f0}.v[data-class=v] .vwrap .vheader .vinput{width:33.33%;border-bottom:1px dashed #dedede}.v[data-class=v] .vwrap .vheader.item2 .vinput{width:50%}.v[data-class=v] .vwrap .vheader.item1 .vinput{width:100%}.v[data-class=v] .vwrap .vheader .vinput:focus{border-bottom-color:#eb5055}@media screen and (max-width:520px){.v[data-class=v] .vwrap .vheader.item2 .vinput,.v[data-class=v] .vwrap .vheader .vinput{width:100%}}.v[data-class=v] .vpower{color:#999;font-size:.75em;padding:.5em 0}.v[data-class=v] .vpower a{font-size:.75em}.v[data-class=v] .vcount{padding:5px;font-weight:600;font-size:1.25em}.v[data-class=v] ol,.v[data-class=v] ul{padding:0;margin-left:1.25em}.v[data-class=v] .txt-center{text-align:center}.v[data-class=v] .txt-right{text-align:right}.v[data-class=v] .pd5{padding:5px}.v[data-class=v] .pd10{padding:10px}.v[data-class=v] .veditor{width:100%;min-height:8.75em;font-size:.875em;background:transparent;resize:vertical;-webkit-transition:all .25s ease;transition:all .25s ease}.v[data-class=v] .vbtn{-webkit-transition-duration:.4s;transition-duration:.4s;text-align:center;color:#555;border:1px solid #ededed;border-radius:.3em;display:inline-block;background:transparent;margin-bottom:0;font-weight:400;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;white-space:nowrap;padding:.5em 1.25em;font-size:.875em;line-height:1.42857143;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:none}.v[data-class=v] .vbtn+.vbtn{margin-left:1.25em}.v[data-class=v] .vbtn:active,.v[data-class=v] .vbtn:hover{color:#3090e4;border-color:#3090e4}.v[data-class=v] .vbtn:disabled{border-color:#e1e1e1;color:#e1e1e1;background-color:#fdfafa;cursor:not-allowed}.v[data-class=v] .vempty{padding:1.25em;text-align:center;color:#555;overflow:auto}.v[data-class=v] .vsys{display:inline-block;padding:.2em .5em;font-size:.75em;border-radius:.2em;margin-right:.3em}@media screen and (max-width:520px){.v[data-class=v] .vsys{display:none}}.v[data-class=v] .vcards{width:100%}.v[data-class=v] .vcards .vcard{padding-top:1.25em;position:relative;display:block}.v[data-class=v] .vcards .vcard:after{content:"";clear:both;display:block}.v[data-class=v] .vcards .vcard .vimg{width:3.125em;height:3.125em;float:left;border-radius:50%;margin-right:.7525em;border:1px solid #f5f5f5;padding:.125em}@media screen and (max-width:720px){.v[data-class=v] .vcards .vcard .vimg{width:2.5em;height:2.5em}}.v[data-class=v] .vcards .vcard .vhead{line-height:1.5;margin-top:0}.v[data-class=v] .vcards .vcard .vhead .vnick{position:relative;font-size:.875em;font-weight:500;margin-right:.875em;cursor:pointer;text-decoration:none;display:inline-block}.v[data-class=v] .vcards .vcard .vhead .vnick:hover{color:#d7191a}.v[data-class=v] .vcards .vcard .vh{overflow:hidden;padding-bottom:.5em;border-bottom:1px dashed #f5f5f5}.v[data-class=v] .vcards .vcard .vh .vtime{font-size:.75em;margin-right:.875em}.v[data-class=v] .vcards .vcard .vh .vmeta{line-height:1;position:relative}.v[data-class=v] .vcards .vcard .vh .vmeta .vat{font-size:.8125em;color:#ef2f11;cursor:pointer;float:right}.v[data-class=v] .vcards .vcard:last-child .vh{border-bottom:none}.v[data-class=v] .vcards .vcard .vcontent{word-wrap:break-word;word-break:break-all;font-size:.875em;line-height:2;position:relative;margin-bottom:.75em;padding-top:.625em}.v[data-class=v] .vcards .vcard .vcontent.expand{cursor:pointer;max-height:8em;overflow:hidden}.v[data-class=v] .vcards .vcard .vcontent.expand:before{display:block;content:"";position:absolute;width:100%;left:0;top:0;bottom:3.15em;background:-webkit-gradient(linear,left top,left bottom,from(hsla(0,0%,100%,0)),to(hsla(0,0%,100%,.9)));background:linear-gradient(180deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.9));z-index:999}.v[data-class=v] .vcards .vcard .vcontent.expand:after{display:block;content:attr(data-expand);text-align:center;color:#828586;position:absolute;width:100%;height:3.15em;line-height:3.15em;left:0;bottom:0;z-index:999;background:hsla(0,0%,100%,.9)}.v[data-class=v] .vcards .vcard .vquote{padding-left:1em;border-left:1px dashed hsla(0,0%,93%,.5)}.v[data-class=v] .vcards .vcard .vquote .vimg{width:2.225em;height:2.225em}.v[data-class=v] .vpage .vmore{margin:1em 0}.v[data-class=v] .clear{content:"";display:block;clear:both}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes pulse{50%{background:#dcdcdc}}@keyframes pulse{50%{background:#dcdcdc}}.v[data-class=v] .vspinner{width:22px;height:22px;display:inline-block;border:6px double #a0a0a0;border-top-color:transparent;border-bottom-color:transparent;border-radius:50%;-webkit-animation:spin 1s infinite linear;animation:spin 1s infinite linear;position:relative;vertical-align:middle;margin:0 5px}.dark .v[data-class=v] .status-bar,.dark .v[data-class=v] .veditor,.dark .v[data-class=v] .vinput,.dark .v[data-class=v] p,.dark .v[data-class=v] pre code,.night .v[data-class=v] .status-bar,.night .v[data-class=v] .veditor,.night .v[data-class=v] .vinput,.night .v[data-class=v] p,.night .v[data-class=v] pre code,.theme__dark .v[data-class=v] .status-bar,.theme__dark .v[data-class=v] .veditor,.theme__dark .v[data-class=v] .vinput,.theme__dark .v[data-class=v] p,.theme__dark .v[data-class=v] pre code,[data-theme=dark] .v[data-class=v] .status-bar,[data-theme=dark] .v[data-class=v] .veditor,[data-theme=dark] .v[data-class=v] .vinput,[data-theme=dark] .v[data-class=v] p,[data-theme=dark] .v[data-class=v] pre code{color:#b2b2b5}.dark .v[data-class=v] .vsys,.dark .v[data-class=v] .vtime,.night .v[data-class=v] .vsys,.night .v[data-class=v] .vtime,.theme__dark .v[data-class=v] .vsys,.theme__dark .v[data-class=v] .vtime,[data-theme=dark] .v[data-class=v] .vsys,[data-theme=dark] .v[data-class=v] .vtime{color:#929298}.dark .v[data-class=v] code,.dark .v[data-class=v] pre,.dark .v[data-class=v] pre code,.night .v[data-class=v] code,.night .v[data-class=v] pre,.night .v[data-class=v] pre code,.theme__dark .v[data-class=v] code,.theme__dark .v[data-class=v] pre,.theme__dark .v[data-class=v] pre code,[data-theme=dark] .v[data-class=v] code,[data-theme=dark] .v[data-class=v] pre,[data-theme=dark] .v[data-class=v] pre code{color:#929298;background-color:#151414}.dark .v[data-class=v] .vwrap,.night .v[data-class=v] .vwrap,.theme__dark .v[data-class=v] .vwrap,[data-theme=dark] .v[data-class=v] .vwrap{border-color:#b2b2b5}.dark .v[data-class=v] .vicon,.night .v[data-class=v] .vicon,.theme__dark .v[data-class=v] .vicon,[data-theme=dark] .v[data-class=v] .vicon{fill:#b2b2b5}.dark .v[data-class=v] .vicon.actived,.night .v[data-class=v] .vicon.actived,.theme__dark .v[data-class=v] .vicon.actived,[data-theme=dark] .v[data-class=v] .vicon.actived{fill:#66b1ff}.dark .v[data-class=v] .vbtn,.night .v[data-class=v] .vbtn,.theme__dark .v[data-class=v] .vbtn,[data-theme=dark] .v[data-class=v] .vbtn{color:#b2b2b5;border-color:#b2b2b5}.dark .v[data-class=v] .vbtn:hover,.night .v[data-class=v] .vbtn:hover,.theme__dark .v[data-class=v] .vbtn:hover,[data-theme=dark] .v[data-class=v] .vbtn:hover{color:#66b1ff;border-color:#66b1ff}.dark .v[data-class=v] a:hover,.night .v[data-class=v] a:hover,.theme__dark .v[data-class=v] a:hover,[data-theme=dark] .v[data-class=v] a:hover{color:#d7191a}.dark .v[data-class=v] .vcards .vcard .vcontent.expand:before,.night .v[data-class=v] .vcards .vcard .vcontent.expand:before,.theme__dark .v[data-class=v] .vcards .vcard .vcontent.expand:before,[data-theme=dark] .v[data-class=v] .vcards .vcard .vcontent.expand:before{background:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.3)),to(rgba(0,0,0,.7)));background:linear-gradient(180deg,rgba(0,0,0,.3),rgba(0,0,0,.7))}.dark .v[data-class=v] .vcards .vcard .vcontent.expand:after,.night .v[data-class=v] .vcards .vcard .vcontent.expand:after,.theme__dark .v[data-class=v] .vcards .vcard .vcontent.expand:after,[data-theme=dark] .v[data-class=v] .vcards .vcard .vcontent.expand:after{background:rgba(0,0,0,.7)}@media (prefers-color-scheme:dark){.v[data-class=v] .status-bar,.v[data-class=v] .veditor,.v[data-class=v] .vinput,.v[data-class=v] p,.v[data-class=v] pre code{color:#b2b2b5}.v[data-class=v] .vsys,.v[data-class=v] .vtime{color:#929298}.v[data-class=v] code,.v[data-class=v] pre,.v[data-class=v] pre code{color:#929298;background-color:#151414}.v[data-class=v] .vwrap{border-color:#b2b2b5}.v[data-class=v] .vicon{fill:#b2b2b5}.v[data-class=v] .vicon.actived{fill:#66b1ff}.v[data-class=v] .vbtn{color:#b2b2b5;border-color:#b2b2b5}.v[data-class=v] .vbtn:hover{color:#66b1ff;border-color:#66b1ff}.v[data-class=v] a:hover{color:#d7191a}.v[data-class=v] .vcards .vcard .vcontent.expand:before{background:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.3)),to(rgba(0,0,0,.7)));background:linear-gradient(180deg,rgba(0,0,0,.3),rgba(0,0,0,.7))}.v[data-class=v] .vcards .vcard .vcontent.expand:after{background:rgba(0,0,0,.7)}}',""])},function(e,t){function n(e,t){var n=e[1]||"",r=e[3];if(!r)return n;if(t&&"function"==typeof btoa){var o=function(e){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */"}(r);return[n].concat(r.sources.map((function(e){return"/*# sourceURL="+r.sourceRoot+e+" */"}))).concat([o]).join("\n")}return[n].join("\n")}e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var r=n(t,e);return t[2]?"@media "+t[2]+"{"+r+"}":r})).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var r={},o=0;o=0&&b.splice(t,1)}function s(e){var t=document.createElement("style");return e.attrs.type="text/css",c(t,e.attrs),a(e,t),t}function l(e){var t=document.createElement("link");return e.attrs.type="text/css",e.attrs.rel="stylesheet",c(t,e.attrs),a(e,t),t}function c(e,t){Object.keys(t).forEach((function(n){e.setAttribute(n,t[n])}))}function u(e,t){var n,r,o,a;if(t.transform&&e.css){if(!(a=t.transform(e.css)))return function(){};e.css=a}if(t.singleton){var c=y++;n=m||(m=s(t)),r=p.bind(null,n,c,!1),o=p.bind(null,n,c,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=l(t),r=d.bind(null,n,t),o=function(){i(n),n.href&&URL.revokeObjectURL(n.href)}):(n=s(t),r=f.bind(null,n),o=function(){i(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else o()}}function p(e,t,n,r){var o=n?"":r.css;if(e.styleSheet)e.styleSheet.cssText=x(t,o);else{var a=document.createTextNode(o),i=e.childNodes;i[t]&&e.removeChild(i[t]),i.length?e.insertBefore(a,i[t]):e.appendChild(a)}}function f(e,t){var n=t.css,r=t.media;if(r&&e.setAttribute("media",r),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}function d(e,t,n){var r=n.css,o=n.sourceMap,a=void 0===t.convertToAbsoluteUrls&&o;(t.convertToAbsoluteUrls||a)&&(r=w(r)),o&&(r+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */");var i=new Blob([r],{type:"text/css"}),s=e.href;e.href=URL.createObjectURL(i),s&&URL.revokeObjectURL(s)}var h={},v=function(e){var t;return function(){return void 0===t&&(t=e.apply(this,arguments)),t}}((function(){return window&&document&&document.all&&!window.atob})),g=function(e){var t={};return function(n){return void 0===t[n]&&(t[n]=e.call(this,n)),t[n]}}((function(e){return document.querySelector(e)})),m=null,y=0,b=[],w=n(62);e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||(t.singleton=v()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=o(e,t);return r(n,t),function(e){for(var a=[],i=0;i0?y+m:""}},function(e,t,n){"use strict";var r=n(216),o=Object.prototype.hasOwnProperty,a={allowDots:!1,allowPrototypes:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:r.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},i=function(e){return e.replace(/&#(\d+);/g,(function(e,t){return String.fromCharCode(parseInt(t,10))}))},s=function(e,t,n){if(e){var r=n.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e,a=/(\[[^[\]]*])/g,i=/(\[[^[\]]*])/.exec(r),s=i?r.slice(0,i.index):r,l=[];if(s){if(!n.plainObjects&&o.call(Object.prototype,s)&&!n.allowPrototypes)return;l.push(s)}for(var c=0;null!==(i=a.exec(r))&&c=0;--o){var a,i=e[o];if("[]"===i&&n.parseArrays)a=[].concat(r);else{a=n.plainObjects?Object.create(null):{};var s="["===i.charAt(0)&&"]"===i.charAt(i.length-1)?i.slice(1,-1):i,l=parseInt(s,10);n.parseArrays||""!==s?!isNaN(l)&&i!==s&&String(l)===s&&l>=0&&n.parseArrays&&l<=n.arrayLimit?(a=[])[l]=r:a[s]=r:a={0:r}}r=a}return r}(l,t,n)}};e.exports=function(e,t){var n=function(e){if(!e)return a;if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new Error("The charset option must be either utf-8, iso-8859-1, or undefined");var t=void 0===e.charset?a.charset:e.charset;return{allowDots:void 0===e.allowDots?a.allowDots:!!e.allowDots,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:a.allowPrototypes,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:a.arrayLimit,charset:t,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:a.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:a.comma,decoder:"function"==typeof e.decoder?e.decoder:a.decoder,delimiter:"string"==typeof e.delimiter||r.isRegExp(e.delimiter)?e.delimiter:a.delimiter,depth:"number"==typeof e.depth?e.depth:a.depth,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:a.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:a.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:a.plainObjects,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:a.strictNullHandling}}(t);if(""===e||null==e)return n.plainObjects?Object.create(null):{};for(var l="string"==typeof e?function(e,t){var n,s={},l=t.ignoreQueryPrefix?e.replace(/^\?/,""):e,c=t.parameterLimit===1/0?void 0:t.parameterLimit,u=l.split(t.delimiter,c),p=-1,f=t.charset;if(t.charsetSentinel)for(n=0;n-1&&(h=h.split(",")),o.call(s,d)?s[d]=r.combine(s[d],h):s[d]=h}return s}(e,n):e,c=n.plainObjects?Object.create(null):{},u=Object.keys(l),p=0;p0?"in "+o:o+" ago":o}}}},function(e,t,n){var r=n(409);e.exports=function(){var e=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],t=["January","February","March","April","May","June","July","August","September","October","November","December"],n=["Su","Mo","Tu","We","Th","Fr","Sa"],o=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],a=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],i=["AM","PM"],s=["am","pm"],l=["a.m.","p.m."],c={MMM:function(t){return e[t.getMonth()]},MMMM:function(e){return t[e.getMonth()]},dd:function(e){return n[e.getDay()]},ddd:function(e){return o[e.getDay()]},dddd:function(e){return a[e.getDay()]},A:function(e){return e.getHours()/12>=1?i[1]:i[0]},a:function(e){return e.getHours()/12>=1?s[1]:s[0]},aa:function(e){return e.getHours()/12>=1?l[1]:l[0]}};return["M","D","DDD","d","Q","W"].forEach((function(e){c[e+"o"]=function(t,n){return function(e){var t=e%100;if(t>20||t<10)switch(t%10){case 1:return e+"st";case 2:return e+"nd";case 3:return e+"rd"}return e+"th"}(n[e](t))}})),{formatters:c,formattingTokensRegExp:r(c)}}},function(e,t){var n=["M","MM","Q","D","DD","DDD","DDDD","d","E","W","WW","YY","YYYY","GG","GGGG","H","HH","h","hh","m","mm","s","ss","S","SS","SSS","Z","ZZ","X","x"];e.exports=function(e){var t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(r);var o=n.concat(t).sort().reverse();return new RegExp("(\\[[^\\[]*\\])|(\\\\)?("+o.join("|")+"|.)","g")}},function(e,t,n){"use strict";var r=n(17),o=n(220),a=n(411),i=n(226);function s(e){var t=new a(e),n=o(a.prototype.request,t);return r.extend(n,a.prototype,t),r.extend(n,t),n}var l=s(n(135));l.Axios=a,l.create=function(e){return s(i(l.defaults,e))},l.Cancel=n(227),l.CancelToken=n(425),l.isCancel=n(225),l.all=function(e){return Promise.all(e)},l.spread=n(426),l.isAxiosError=n(427),e.exports=l,e.exports.default=l},function(e,t,n){"use strict";var r=n(17),o=n(221),a=n(412),i=n(413),s=n(226),l=n(423),c=l.validators;function u(e){this.defaults=e,this.interceptors={request:new a,response:new a}}u.prototype.request=function(e){"string"==typeof e?(e=arguments[1]||{}).url=arguments[0]:e=e||{},(e=s(this.defaults,e)).method?e.method=e.method.toLowerCase():this.defaults.method?e.method=this.defaults.method.toLowerCase():e.method="get";var t=e.transitional;void 0!==t&&l.assertOptions(t,{silentJSONParsing:c.transitional(c.boolean,"1.0.0"),forcedJSONParsing:c.transitional(c.boolean,"1.0.0"),clarifyTimeoutError:c.transitional(c.boolean,"1.0.0")},!1);var n=[],r=!0;this.interceptors.request.forEach((function(t){"function"==typeof t.runWhen&&!1===t.runWhen(e)||(r=r&&t.synchronous,n.unshift(t.fulfilled,t.rejected))}));var o,a=[];if(this.interceptors.response.forEach((function(e){a.push(e.fulfilled,e.rejected)})),!r){var u=[i,void 0];for(Array.prototype.unshift.apply(u,n),u=u.concat(a),o=Promise.resolve(e);u.length;)o=o.then(u.shift(),u.shift());return o}for(var p=e;n.length;){var f=n.shift(),d=n.shift();try{p=f(p)}catch(e){d(e);break}}try{o=i(p)}catch(e){return Promise.reject(e)}for(;a.length;)o=o.then(a.shift(),a.shift());return o},u.prototype.getUri=function(e){return e=s(this.defaults,e),o(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},r.forEach(["delete","get","head","options"],(function(e){u.prototype[e]=function(t,n){return this.request(s(n||{},{method:e,url:t,data:(n||{}).data}))}})),r.forEach(["post","put","patch"],(function(e){u.prototype[e]=function(t,n,r){return this.request(s(r||{},{method:e,url:t,data:n}))}})),e.exports=u},function(e,t,n){"use strict";var r=n(17);function o(){this.handlers=[]}o.prototype.use=function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1},o.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},o.prototype.forEach=function(e){r.forEach(this.handlers,(function(t){null!==t&&e(t)}))},e.exports=o},function(e,t,n){"use strict";var r=n(17),o=n(414),a=n(225),i=n(135);function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}e.exports=function(e){return s(e),e.headers=e.headers||{},e.data=o.call(e,e.data,e.headers,e.transformRequest),e.headers=r.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),r.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||i.adapter)(e).then((function(t){return s(e),t.data=o.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return a(t)||(s(e),t&&t.response&&(t.response.data=o.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))}},function(e,t,n){"use strict";var r=n(17),o=n(135);e.exports=function(e,t,n){var a=this||o;return r.forEach(n,(function(n){e=n.call(a,e,t)})),e}},function(e,t,n){"use strict";var r=n(17);e.exports=function(e,t){r.forEach(e,(function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])}))}},function(e,t,n){"use strict";var r=n(224);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(17);e.exports=r.isStandardBrowserEnv()?{write:function(e,t,n,o,a,i){var s=[];s.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),r.isString(o)&&s.push("path="+o),r.isString(a)&&s.push("domain="+a),!0===i&&s.push("secure"),document.cookie=s.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},function(e,t,n){"use strict";var r=n(419),o=n(420);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t,n){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t,n){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(17),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,a,i={};return e?(r.forEach(e.split("\n"),(function(e){if(a=e.indexOf(":"),t=r.trim(e.substr(0,a)).toLowerCase(),n=r.trim(e.substr(a+1)),t){if(i[t]&&o.indexOf(t)>=0)return;i[t]="set-cookie"===t?(i[t]?i[t]:[]).concat([n]):i[t]?i[t]+", "+n:n}})),i):i}},function(e,t,n){"use strict";var r=n(17);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function o(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=o(window.location.href),function(t){var n=r.isString(t)?o(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},function(e,t,n){"use strict";var r=n(424),o={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){o[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));var a={},i=r.version.split(".");function s(e,t){for(var n=t?t.split("."):i,r=e.split("."),o=0;o<3;o++){if(n[o]>r[o])return!0;if(n[o]0;){var a=r[o],i=t[a];if(i){var s=e[a],l=void 0===s||i(s,a,e);if(!0!==l)throw new TypeError("option "+a+" must be "+l)}else if(!0!==n)throw Error("Unknown option "+a)}},validators:o}},function(e){e.exports=JSON.parse('{"name":"axios","version":"0.21.4","description":"Promise based HTTP client for the browser and node.js","main":"index.js","scripts":{"test":"grunt test","start":"node ./sandbox/server.js","build":"NODE_ENV=production grunt build","preversion":"npm test","version":"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json","postversion":"git push && git push --tags","examples":"node ./examples/server.js","coveralls":"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js","fix":"eslint --fix lib/**/*.js"},"repository":{"type":"git","url":"https://github.com/axios/axios.git"},"keywords":["xhr","http","ajax","promise","node"],"author":"Matt Zabriskie","license":"MIT","bugs":{"url":"https://github.com/axios/axios/issues"},"homepage":"https://axios-http.com","devDependencies":{"coveralls":"^3.0.0","es6-promise":"^4.2.4","grunt":"^1.3.0","grunt-banner":"^0.6.0","grunt-cli":"^1.2.0","grunt-contrib-clean":"^1.1.0","grunt-contrib-watch":"^1.0.0","grunt-eslint":"^23.0.0","grunt-karma":"^4.0.0","grunt-mocha-test":"^0.13.3","grunt-ts":"^6.0.0-beta.19","grunt-webpack":"^4.0.2","istanbul-instrumenter-loader":"^1.0.0","jasmine-core":"^2.4.1","karma":"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-firefox-launcher":"^2.1.0","karma-jasmine":"^1.1.1","karma-jasmine-ajax":"^0.1.13","karma-safari-launcher":"^1.0.0","karma-sauce-launcher":"^4.3.6","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.8","karma-webpack":"^4.0.2","load-grunt-tasks":"^3.5.2","minimist":"^1.2.0","mocha":"^8.2.1","sinon":"^4.5.0","terser-webpack-plugin":"^4.2.3","typescript":"^4.0.5","url-search-params":"^0.10.0","webpack":"^4.44.2","webpack-dev-server":"^3.11.0"},"browser":{"./lib/adapters/http.js":"./lib/adapters/xhr.js"},"jsdelivr":"dist/axios.min.js","unpkg":"dist/axios.min.js","typings":"./index.d.ts","dependencies":{"follow-redirects":"^1.14.0"},"bundlesize":[{"path":"./dist/axios.min.js","threshold":"5kB"}]}')},function(e,t,n){"use strict";var r=n(227);function o(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;e((function(e){n.reason||(n.reason=new r(e),t(n.reason))}))}o.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},o.source=function(){var e;return{token:new o((function(t){e=t})),cancel:e}},e.exports=o},function(e,t,n){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t,n){"use strict";e.exports=function(e){return"object"==typeof e&&!0===e.isAxiosError}},function(e,t,n){},function(e,t,n){"use strict";n(228)},function(e,t,n){},function(e,t,n){e.exports=function(e){function t(e){let n,o,a,i=null;function s(...e){if(!s.enabled)return;const r=s,o=Number(new Date),a=o-(n||o);r.diff=a,r.prev=n,r.curr=o,n=o,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let i=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,(n,o)=>{if("%%"===n)return"%";i++;const a=t.formatters[o];if("function"==typeof a){const t=e[i];n=a.call(r,t),e.splice(i,1),i--}return n}),t.formatArgs.call(r,e);(r.log||t.log).apply(r,e)}return s.namespace=e,s.useColors=t.useColors(),s.color=t.selectColor(e),s.extend=r,s.destroy=t.destroy,Object.defineProperty(s,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==i?i:(o!==t.namespaces&&(o=t.namespaces,a=t.enabled(e)),a),set:e=>{i=e}}),"function"==typeof t.init&&t.init(s),s}function r(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function o(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(o),...t.skips.map(o).map(e=>"-"+e)].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),o=r.length;for(n=0;n{t[n]=e[n]}),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t=1.5*n;return Math.round(e/n)+" "+r+(o?"s":"")}e.exports=function(e,t){t=t||{};var s=typeof e;if("string"===s&&e.length>0)return function(e){if((e=String(e)).length>100)return;var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!t)return;var i=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*i;case"weeks":case"week":case"w":return 6048e5*i;case"days":case"day":case"d":return i*a;case"hours":case"hour":case"hrs":case"hr":case"h":return i*o;case"minutes":case"minute":case"mins":case"min":case"m":return i*r;case"seconds":case"second":case"secs":case"sec":case"s":return i*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return i;default:return}}(e);if("number"===s&&isFinite(e))return t.long?function(e){var t=Math.abs(e);if(t>=a)return i(e,t,a,"day");if(t>=o)return i(e,t,o,"hour");if(t>=r)return i(e,t,r,"minute");if(t>=n)return i(e,t,n,"second");return e+" ms"}(e):function(e){var t=Math.abs(e);if(t>=a)return Math.round(e/a)+"d";if(t>=o)return Math.round(e/o)+"h";if(t>=r)return Math.round(e/r)+"m";if(t>=n)return Math.round(e/n)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,n){},function(e,t,n){"use strict";n(232)},function(e,t,n){"use strict";n(233)},function(e,t,n){"use strict";n.r(t);n(145),n(253),n(263),n(265),n(18);function r(e,t,n,r,o,a,i){try{var s=e[a](i),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function o(e){return function(){var t=this,n=arguments;return new Promise((function(o,a){var i=e.apply(t,n);function s(e){r(i,o,a,s,l,"next",e)}function l(e){r(i,o,a,s,l,"throw",e)}s(void 0)}))}}n(169),n(36),n(24),n(26),n(44),n(21);var a=n(0);function i(e,t){for(var n in t)e[n]=t[n];return e}var s=/[!'()*]/g,l=function(e){return"%"+e.charCodeAt(0).toString(16)},c=/%2C/g,u=function(e){return encodeURIComponent(e).replace(s,l).replace(c,",")};function p(e){try{return decodeURIComponent(e)}catch(e){0}return e}var f=function(e){return null==e||"object"==typeof e?e:String(e)};function d(e){var t={};return(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var n=e.replace(/\+/g," ").split("="),r=p(n.shift()),o=n.length>0?p(n.join("=")):null;void 0===t[r]?t[r]=o:Array.isArray(t[r])?t[r].push(o):t[r]=[t[r],o]})),t):t}function h(e){var t=e?Object.keys(e).map((function(t){var n=e[t];if(void 0===n)return"";if(null===n)return u(t);if(Array.isArray(n)){var r=[];return n.forEach((function(e){void 0!==e&&(null===e?r.push(u(t)):r.push(u(t)+"="+u(e)))})),r.join("&")}return u(t)+"="+u(n)})).filter((function(e){return e.length>0})).join("&"):null;return t?"?"+t:""}var v=/\/?$/;function g(e,t,n,r){var o=r&&r.options.stringifyQuery,a=t.query||{};try{a=m(a)}catch(e){}var i={name:t.name||e&&e.name,meta:e&&e.meta||{},path:t.path||"/",hash:t.hash||"",query:a,params:t.params||{},fullPath:w(t,o),matched:e?b(e):[]};return n&&(i.redirectedFrom=w(n,o)),Object.freeze(i)}function m(e){if(Array.isArray(e))return e.map(m);if(e&&"object"==typeof e){var t={};for(var n in e)t[n]=m(e[n]);return t}return e}var y=g(null,{path:"/"});function b(e){for(var t=[];e;)t.unshift(e),e=e.parent;return t}function w(e,t){var n=e.path,r=e.query;void 0===r&&(r={});var o=e.hash;return void 0===o&&(o=""),(n||"/")+(t||h)(r)+o}function x(e,t,n){return t===y?e===t:!!t&&(e.path&&t.path?e.path.replace(v,"")===t.path.replace(v,"")&&(n||e.hash===t.hash&&_(e.query,t.query)):!(!e.name||!t.name)&&(e.name===t.name&&(n||e.hash===t.hash&&_(e.query,t.query)&&_(e.params,t.params))))}function _(e,t){if(void 0===e&&(e={}),void 0===t&&(t={}),!e||!t)return e===t;var n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((function(n,o){var a=e[n];if(r[o]!==n)return!1;var i=t[n];return null==a||null==i?a===i:"object"==typeof a&&"object"==typeof i?_(a,i):String(a)===String(i)}))}function k(e){for(var t=0;t=0&&(t=e.slice(r),e=e.slice(0,r));var o=e.indexOf("?");return o>=0&&(n=e.slice(o+1),e=e.slice(0,o)),{path:e,query:n,hash:t}}(o.path||""),u=t&&t.path||"/",p=c.path?O(c.path,u,n||o.append):u,h=function(e,t,n){void 0===t&&(t={});var r,o=n||d;try{r=o(e||"")}catch(e){r={}}for(var a in t){var i=t[a];r[a]=Array.isArray(i)?i.map(f):f(i)}return r}(c.query,o.query,r&&r.options.parseQuery),v=o.hash||c.hash;return v&&"#"!==v.charAt(0)&&(v="#"+v),{_normalized:!0,path:p,query:h,hash:v}}var W,J=function(){},K={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),a=o.location,s=o.route,l=o.href,c={},u=n.options.linkActiveClass,p=n.options.linkExactActiveClass,f=null==u?"router-link-active":u,d=null==p?"router-link-exact-active":p,h=null==this.activeClass?f:this.activeClass,m=null==this.exactActiveClass?d:this.exactActiveClass,y=s.redirectedFrom?g(null,Q(s.redirectedFrom),null,n):s;c[m]=x(r,y,this.exactPath),c[h]=this.exact||this.exactPath?c[m]:function(e,t){return 0===e.path.replace(v,"/").indexOf(t.path.replace(v,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(r,y);var b=c[m]?this.ariaCurrentValue:null,w=function(e){G(e)&&(t.replace?n.replace(a,J):n.push(a,J))},_={click:G};Array.isArray(this.event)?this.event.forEach((function(e){_[e]=w})):_[this.event]=w;var k={class:c},S=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:l,route:s,navigate:w,isActive:c[h],isExactActive:c[m]});if(S){if(1===S.length)return S[0];if(S.length>1||!S.length)return 0===S.length?e():e("span",{},S)}if("a"===this.tag)k.on=_,k.attrs={href:l,"aria-current":b};else{var C=function e(t){var n;if(t)for(var r=0;r-1&&(s.params[f]=n.params[f]);return s.path=H(u.path,s.params),l(u,s,i)}if(s.path){s.params={};for(var d=0;d=e.length?n():e[o]?t(e[o],(function(){r(o+1)})):r(o+1)};r(0)}var _e={redirected:2,aborted:4,cancelled:8,duplicated:16};function ke(e,t){return Ce(e,t,_e.redirected,'Redirected when going from "'+e.fullPath+'" to "'+function(e){if("string"==typeof e)return e;if("path"in e)return e.path;var t={};return Oe.forEach((function(n){n in e&&(t[n]=e[n])})),JSON.stringify(t,null,2)}(t)+'" via a navigation guard.')}function Se(e,t){return Ce(e,t,_e.cancelled,'Navigation cancelled from "'+e.fullPath+'" to "'+t.fullPath+'" with a new navigation.')}function Ce(e,t,n,r){var o=new Error(r);return o._isRouter=!0,o.from=e,o.to=t,o.type=n,o}var Oe=["params","query","hash"];function Te(e){return Object.prototype.toString.call(e).indexOf("Error")>-1}function Ae(e,t){return Te(e)&&e._isRouter&&(null==t||e.type===t)}function $e(e){return function(t,n,r){var o=!1,a=0,i=null;je(e,(function(e,t,n,s){if("function"==typeof e&&void 0===e.cid){o=!0,a++;var l,c=Le((function(t){var o;((o=t).__esModule||Ee&&"Module"===o[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:W.extend(t),n.components[s]=t,--a<=0&&r()})),u=Le((function(e){var t="Failed to resolve async component "+s+": "+e;i||(i=Te(e)?e:new Error(t),r(i))}));try{l=e(c,u)}catch(e){u(e)}if(l)if("function"==typeof l.then)l.then(c,u);else{var p=l.component;p&&"function"==typeof p.then&&p.then(c,u)}}})),o||r()}}function je(e,t){return Pe(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function Pe(e){return Array.prototype.concat.apply([],e)}var Ee="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Le(e){var t=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!t)return t=!0,e.apply(this,n)}}var Ie=function(e,t){this.router=e,this.base=function(e){if(!e)if(Y){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=y,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function Me(e,t,n,r){var o=je(e,(function(e,r,o,a){var i=function(e,t){"function"!=typeof e&&(e=W.extend(e));return e.options[t]}(e,t);if(i)return Array.isArray(i)?i.map((function(e){return n(e,r,o,a)})):n(i,r,o,a)}));return Pe(r?o.reverse():o)}function Re(e,t){if(t)return function(){return e.apply(t,arguments)}}Ie.prototype.listen=function(e){this.cb=e},Ie.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},Ie.prototype.onError=function(e){this.errorCbs.push(e)},Ie.prototype.transitionTo=function(e,t,n){var r,o=this;try{r=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var a=this.current;this.confirmTransition(r,(function(){o.updateRoute(r),t&&t(r),o.ensureURL(),o.router.afterHooks.forEach((function(e){e&&e(r,a)})),o.ready||(o.ready=!0,o.readyCbs.forEach((function(e){e(r)})))}),(function(e){n&&n(e),e&&!o.ready&&(Ae(e,_e.redirected)&&a===y||(o.ready=!0,o.readyErrorCbs.forEach((function(t){t(e)}))))}))},Ie.prototype.confirmTransition=function(e,t,n){var r=this,o=this.current;this.pending=e;var a=function(e){!Ae(e)&&Te(e)&&(r.errorCbs.length?r.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},i=e.matched.length-1,s=o.matched.length-1;if(x(e,o)&&i===s&&e.matched[i]===o.matched[s])return this.ensureURL(),a(function(e,t){var n=Ce(e,t,_e.duplicated,'Avoided redundant navigation to current location: "'+e.fullPath+'".');return n.name="NavigationDuplicated",n}(o,e));var l=function(e,t){var n,r=Math.max(e.length,t.length);for(n=0;n0)){var t=this.router,n=t.options.scrollBehavior,r=ye&&n;r&&this.listeners.push(le());var o=function(){var n=e.current,o=Ne(e.base);e.current===y&&o===e._startLocation||e.transitionTo(o,(function(e){r&&ce(t,e,n,!0)}))};window.addEventListener("popstate",o),this.listeners.push((function(){window.removeEventListener("popstate",o)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){be(T(r.base+e.fullPath)),ce(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){we(T(r.base+e.fullPath)),ce(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(Ne(this.base)!==this.current.fullPath){var t=T(this.base+this.current.fullPath);e?be(t):we(t)}},t.prototype.getCurrentLocation=function(){return Ne(this.base)},t}(Ie);function Ne(e){var t=window.location.pathname,n=t.toLowerCase(),r=e.toLowerCase();return!e||n!==r&&0!==n.indexOf(T(r+"/"))||(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var Fe=function(e){function t(t,n,r){e.call(this,t,n),r&&function(e){var t=Ne(e);if(!/^\/#/.test(t))return window.location.replace(T(e+"/#"+t)),!0}(this.base)||ze()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=ye&&t;n&&this.listeners.push(le());var r=function(){var t=e.current;ze()&&e.transitionTo(Ue(),(function(r){n&&ce(e.router,r,t,!0),ye||Ve(r.fullPath)}))},o=ye?"popstate":"hashchange";window.addEventListener(o,r),this.listeners.push((function(){window.removeEventListener(o,r)}))}},t.prototype.push=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){qe(e.fullPath),ce(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,o=this.current;this.transitionTo(e,(function(e){Ve(e.fullPath),ce(r.router,e,o,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;Ue()!==t&&(e?qe(t):Ve(t))},t.prototype.getCurrentLocation=function(){return Ue()},t}(Ie);function ze(){var e=Ue();return"/"===e.charAt(0)||(Ve("/"+e),!1)}function Ue(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function Be(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function qe(e){ye?be(Be(e)):window.location.hash=e}function Ve(e){ye?we(Be(e)):window.location.replace(Be(e))}var He=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index+1).concat(e),r.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var e=t.current;t.index=n,t.updateRoute(r),t.router.afterHooks.forEach((function(t){t&&t(r,e)}))}),(function(e){Ae(e,_e.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(Ie),Qe=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=ee(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!ye&&!1!==e.fallback,this.fallback&&(t="hash"),Y||(t="abstract"),this.mode=t,t){case"history":this.history=new De(this,e.base);break;case"hash":this.history=new Fe(this,e.base,this.fallback);break;case"abstract":this.history=new He(this,e.base);break;default:0}},We={currentRoute:{configurable:!0}};function Je(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}Qe.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},We.currentRoute.get=function(){return this.history&&this.history.current},Qe.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof De||n instanceof Fe){var r=function(e){n.setupListeners(),function(e){var r=n.current,o=t.options.scrollBehavior;ye&&o&&"fullPath"in e&&ce(t,e,r,!1)}(e)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},Qe.prototype.beforeEach=function(e){return Je(this.beforeHooks,e)},Qe.prototype.beforeResolve=function(e){return Je(this.resolveHooks,e)},Qe.prototype.afterEach=function(e){return Je(this.afterHooks,e)},Qe.prototype.onReady=function(e,t){this.history.onReady(e,t)},Qe.prototype.onError=function(e){this.history.onError(e)},Qe.prototype.push=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.push(e,t,n)}));this.history.push(e,t,n)},Qe.prototype.replace=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.replace(e,t,n)}));this.history.replace(e,t,n)},Qe.prototype.go=function(e){this.history.go(e)},Qe.prototype.back=function(){this.go(-1)},Qe.prototype.forward=function(){this.go(1)},Qe.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},Qe.prototype.resolve=function(e,t,n){var r=Q(e,t=t||this.history.current,n,this),o=this.match(r,t),a=o.redirectedFrom||o.fullPath;return{location:r,route:o,href:function(e,t,n){var r="hash"===n?"#"+t:t;return e?T(e+"/"+r):r}(this.history.base,a,this.mode),normalizedTo:r,resolved:o}},Qe.prototype.getRoutes=function(){return this.matcher.getRoutes()},Qe.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==y&&this.history.transitionTo(this.history.getCurrentLocation())},Qe.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==y&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Qe.prototype,We),Qe.install=function e(t){if(!e.installed||W!==t){e.installed=!0,W=t;var n=function(e){return void 0!==e},r=function(e,t){var r=e.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",S),t.component("RouterLink",K);var o=t.config.optionMergeStrategies;o.beforeRouteEnter=o.beforeRouteLeave=o.beforeRouteUpdate=o.created}},Qe.version="3.5.2",Qe.isNavigationFailure=Ae,Qe.NavigationFailureType=_e,Qe.START_LOCATION=y,Y&&window.Vue&&window.Vue.use(Qe);var Ke=Qe;n(173),n(174),n(175),n(74),n(269),n(51),n(52),n(270);function Ge(e){e.locales&&Object.keys(e.locales).forEach((function(t){e.locales[t].path=t})),Object.freeze(e)}n(140);var Ye=n(58),Xe=(n(184),n(37),n(56),n(276),n(277),{NotFound:function(){return Promise.all([n.e(0),n.e(15)]).then(n.bind(null,672))},Category:function(){return Promise.all([n.e(0),n.e(1),n.e(8)]).then(n.bind(null,673))},Layout:function(){return Promise.all([n.e(0),n.e(1),n.e(4)]).then(n.bind(null,671))},Tag:function(){return Promise.all([n.e(0),n.e(1),n.e(6)]).then(n.bind(null,674))},Tags:function(){return Promise.all([n.e(0),n.e(1),n.e(7)]).then(n.bind(null,675))},TimeLines:function(){return Promise.all([n.e(0),n.e(1),n.e(34)]).then(n.bind(null,676))}}),Ze={"v-4da69628":function(){return n.e(48).then(n.bind(null,677))},"v-596412a3":function(){return n.e(16).then(n.bind(null,678))},"v-147c91e8":function(){return n.e(49).then(n.bind(null,679))},"v-65a6bb79":function(){return n.e(17).then(n.bind(null,680))},"v-6e62fcdc":function(){return n.e(50).then(n.bind(null,681))},"v-e67597a2":function(){return n.e(18).then(n.bind(null,682))},"v-9c213422":function(){return n.e(10).then(n.bind(null,683))},"v-9afd68e4":function(){return n.e(53).then(n.bind(null,684))},"v-6ff39fcd":function(){return n.e(51).then(n.bind(null,685))},"v-51483fa7":function(){return n.e(54).then(n.bind(null,686))},"v-7022cea2":function(){return n.e(52).then(n.bind(null,687))},"v-af3283e2":function(){return n.e(5).then(n.bind(null,688))},"v-23544f2f":function(){return n.e(55).then(n.bind(null,689))},"v-795d1e6f":function(){return n.e(38).then(n.bind(null,690))},"v-769e1d81":function(){return n.e(57).then(n.bind(null,691))},"v-573687b9":function(){return n.e(56).then(n.bind(null,692))},"v-73606efa":function(){return n.e(58).then(n.bind(null,693))},"v-58dfedef":function(){return n.e(14).then(n.bind(null,694))},"v-1876b22a":function(){return n.e(37).then(n.bind(null,695))},"v-365942ea":function(){return n.e(39).then(n.bind(null,696))},"v-a7177b82":function(){return n.e(59).then(n.bind(null,697))},"v-ad850a22":function(){return n.e(3).then(n.bind(null,698))},"v-994a2be2":function(){return n.e(61).then(n.bind(null,699))},"v-40365722":function(){return n.e(40).then(n.bind(null,700))},"v-32f558ef":function(){return n.e(60).then(n.bind(null,701))},"v-f06bc1e2":function(){return n.e(62).then(n.bind(null,702))},"v-7d944daf":function(){return n.e(64).then(n.bind(null,703))},"v-216f4f6f":function(){return n.e(63).then(n.bind(null,704))},"v-11663be3":function(){return n.e(35).then(n.bind(null,705))},"v-6024e91e":function(){return n.e(66).then(n.bind(null,706))},"v-35439c93":function(){return n.e(67).then(n.bind(null,707))},"v-9843a6b6":function(){return n.e(36).then(n.bind(null,708))},"v-5667600f":function(){return n.e(65).then(n.bind(null,709))},"v-775fb0fc":function(){return n.e(68).then(n.bind(null,710))},"v-0407a904":function(){return n.e(72).then(n.bind(null,711))},"v-c142182e":function(){return n.e(69).then(n.bind(null,712))},"v-e8b873a2":function(){return n.e(71).then(n.bind(null,713))},"v-8bb6c1e2":function(){return n.e(24).then(n.bind(null,714))},"v-13441367":function(){return n.e(42).then(n.bind(null,715))},"v-d8759ade":function(){return n.e(70).then(n.bind(null,716))},"v-10aa3aa9":function(){return n.e(75).then(n.bind(null,717))},"v-38951577":function(){return n.e(26).then(n.bind(null,718))},"v-cfee443a":function(){return n.e(73).then(n.bind(null,719))},"v-ba305d7e":function(){return n.e(74).then(n.bind(null,720))},"v-6c01f487":function(){return n.e(41).then(n.bind(null,721))},"v-5f47816f":function(){return n.e(25).then(n.bind(null,722))},"v-236e4b6f":function(){return n.e(19).then(n.bind(null,723))},"v-405ccd6f":function(){return n.e(11).then(n.bind(null,724))},"v-6a42fdbc":function(){return n.e(43).then(n.bind(null,725))},"v-ace41292":function(){return n.e(77).then(n.bind(null,726))},"v-c26696ae":function(){return n.e(78).then(n.bind(null,727))},"v-bd6f557a":function(){return n.e(76).then(n.bind(null,728))},"v-65d68009":function(){return n.e(79).then(n.bind(null,729))},"v-74987d65":function(){return n.e(13).then(n.bind(null,730))},"v-e7ff6efe":function(){return n.e(45).then(n.bind(null,731))},"v-7c323989":function(){return n.e(80).then(n.bind(null,732))},"v-4cbd3a29":function(){return n.e(81).then(n.bind(null,733))},"v-11d8a738":function(){return n.e(82).then(n.bind(null,734))},"v-c6899e26":function(){return n.e(46).then(n.bind(null,735))},"v-6d2742e9":function(){return n.e(28).then(n.bind(null,736))},"v-3d63be0f":function(){return n.e(83).then(n.bind(null,737))},"v-ffcfe472":function(){return n.e(84).then(n.bind(null,738))},"v-ffed75a2":function(){return n.e(85).then(n.bind(null,739))},"v-7ab54286":function(){return n.e(27).then(n.bind(null,740))},"v-0f7abfe2":function(){return n.e(86).then(n.bind(null,741))},"v-5f2c0232":function(){return n.e(9).then(n.bind(null,742))},"v-7407ac37":function(){return n.e(12).then(n.bind(null,743))},"v-65a04ebc":function(){return n.e(44).then(n.bind(null,744))},"v-2c088596":function(){return n.e(87).then(n.bind(null,745))},"v-22eef1cf":function(){return n.e(20).then(n.bind(null,746))},"v-657fc160":function(){return n.e(29).then(n.bind(null,747))},"v-2ea49e47":function(){return n.e(89).then(n.bind(null,748))},"v-473c041a":function(){return n.e(88).then(n.bind(null,749))},"v-380e1338":function(){return n.e(90).then(n.bind(null,750))},"v-d87f35e2":function(){return n.e(91).then(n.bind(null,751))},"v-3ca80b68":function(){return n.e(92).then(n.bind(null,752))},"v-45a79697":function(){return n.e(21).then(n.bind(null,753))},"v-b18a22e2":function(){return n.e(22).then(n.bind(null,754))},"v-7777688f":function(){return n.e(30).then(n.bind(null,755))},"v-c30d6fd6":function(){return n.e(47).then(n.bind(null,756))},"v-3d0a2735":function(){return n.e(23).then(n.bind(null,757))},"v-3bd6109a":function(){return n.e(31).then(n.bind(null,758))},"v-627f45e2":function(){return n.e(93).then(n.bind(null,759))},"v-000728af":function(){return n.e(32).then(n.bind(null,760))},"v-612c185a":function(){return n.e(94).then(n.bind(null,761))},"v-ebbc0e96":function(){return n.e(95).then(n.bind(null,762))},"v-b5c38f26":function(){return n.e(96).then(n.bind(null,763))},"v-4f836b11":function(){return n.e(97).then(n.bind(null,764))}};function et(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var tt=/-(\w)/g,nt=et((function(e){return e.replace(tt,(function(e,t){return t?t.toUpperCase():""}))})),rt=/\B([A-Z])/g,ot=et((function(e){return e.replace(rt,"-$1").toLowerCase()})),at=et((function(e){return e.charAt(0).toUpperCase()+e.slice(1)}));function it(e,t){if(t)return e(t)?e(t):t.includes("-")?e(at(nt(t))):e(at(t))||e(ot(t))}var st=Object.assign({},Xe,Ze),lt=function(e){return st[e]},ct=function(e){return Ze[e]},ut=function(e){return Xe[e]},pt=function(e){return a.default.component(e)};function ft(e){return it(ct,e)}function dt(e){return it(ut,e)}function ht(e){return it(lt,e)}function vt(e){return it(pt,e)}function gt(){for(var e=arguments.length,t=new Array(e),n=0;n"})).join("\n "):"",this.$ssrContext.canonicalLink=St(this.$canonicalUrl)}var t},mounted:function(){this.currentMetaTags=Object(Ye.a)(document.querySelectorAll("meta")),this.updateMeta(),this.updateCanonicalLink()},methods:{updateMeta:function(){document.title=this.$title,document.documentElement.lang=this.$lang;var e=this.getMergedMetaTags();this.currentMetaTags=Ct(e,this.currentMetaTags)},getMergedMetaTags:function(){var e=this.$page.frontmatter.meta||[];return xt()([{name:"description",content:this.$description}],e,this.siteMeta,Ot)},updateCanonicalLink:function(){kt(),this.$canonicalUrl&&document.head.insertAdjacentHTML("beforeend",St(this.$canonicalUrl))}},watch:{$page:function(){this.updateMeta(),this.updateCanonicalLink()}},beforeDestroy:function(){Ct(null,this.currentMetaTags),kt()}};function kt(){var e=document.querySelector("link[rel='canonical']");e&&e.remove()}function St(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e?''):""}function Ct(e,t){if(t&&Object(Ye.a)(t).filter((function(e){return e.parentNode===document.head})).forEach((function(e){return document.head.removeChild(e)})),e)return e.map((function(e){var t=document.createElement("meta");return Object.keys(e).forEach((function(n){t.setAttribute(n,e[n])})),document.head.appendChild(t),t}))}function Ot(e){for(var t=0,n=["name","property","itemprop"];t=s.parentElement.offsetTop+10&&(!l||r1&&void 0!==arguments[1]?arguments[1]:{},r=window.Promise||function(e){function t(){}e(t,t)},o=function(e){var t=e.target;t!==C?-1!==b.indexOf(t)&&v({target:t}):h()},a=function(){if(!x&&S.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(_-e)>k.scrollOffset&&setTimeout(h,150)}},i=function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||h()},s=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e;if(e.background&&(C.style.background=e.background),e.container&&e.container instanceof Object&&(t.container=$t({},k.container,e.container)),e.template){var n=Pt(e.template)?e.template:document.querySelector(e.template);t.template=n}return k=$t({},k,t),b.forEach((function(e){e.dispatchEvent(Rt("medium-zoom:update",{detail:{zoom:O}}))})),O},l=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return e($t({},k,t))},c=function(){for(var e=arguments.length,t=Array(e),n=0;n0?t.reduce((function(e,t){return[].concat(e,Lt(t))}),[]):b;return r.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(Rt("medium-zoom:detach",{detail:{zoom:O}}))})),b=b.filter((function(e){return-1===r.indexOf(e)})),O},p=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return b.forEach((function(r){r.addEventListener("medium-zoom:"+e,t,n)})),w.push({type:"medium-zoom:"+e,listener:t,options:n}),O},f=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return b.forEach((function(r){r.removeEventListener("medium-zoom:"+e,t,n)})),w=w.filter((function(n){return!(n.type==="medium-zoom:"+e&&n.listener.toString()===t.toString())})),O},d=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.target,n=function(){var e={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},t=void 0,n=void 0;if(k.container)if(k.container instanceof Object)t=(e=$t({},e,k.container)).width-e.left-e.right-2*k.margin,n=e.height-e.top-e.bottom-2*k.margin;else{var r=(Pt(k.container)?k.container:document.querySelector(k.container)).getBoundingClientRect(),o=r.width,a=r.height,i=r.left,s=r.top;e=$t({},e,{width:o,height:a,left:i,top:s})}t=t||e.width-2*k.margin,n=n||e.height-2*k.margin;var l=S.zoomedHd||S.original,c=Et(l)?t:l.naturalWidth||t,u=Et(l)?n:l.naturalHeight||n,p=l.getBoundingClientRect(),f=p.top,d=p.left,h=p.width,v=p.height,g=Math.min(c,t)/h,m=Math.min(u,n)/v,y=Math.min(g,m),b="scale("+y+") translate3d("+((t-h)/2-d+k.margin+e.left)/y+"px, "+((n-v)/2-f+k.margin+e.top)/y+"px, 0)";S.zoomed.style.transform=b,S.zoomedHd&&(S.zoomedHd.style.transform=b)};return new r((function(e){if(t&&-1===b.indexOf(t))e(O);else{if(S.zoomed)e(O);else{if(t)S.original=t;else{if(!(b.length>0))return void e(O);var r=b;S.original=r[0]}if(S.original.dispatchEvent(Rt("medium-zoom:open",{detail:{zoom:O}})),_=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,x=!0,S.zoomed=Mt(S.original),document.body.appendChild(C),k.template){var o=Pt(k.template)?k.template:document.querySelector(k.template);S.template=document.createElement("div"),S.template.appendChild(o.content.cloneNode(!0)),document.body.appendChild(S.template)}if(document.body.appendChild(S.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),S.original.classList.add("medium-zoom-image--hidden"),S.zoomed.classList.add("medium-zoom-image--opened"),S.zoomed.addEventListener("click",h),S.zoomed.addEventListener("transitionend",(function t(){x=!1,S.zoomed.removeEventListener("transitionend",t),S.original.dispatchEvent(Rt("medium-zoom:opened",{detail:{zoom:O}})),e(O)})),S.original.getAttribute("data-zoom-src")){S.zoomedHd=S.zoomed.cloneNode(),S.zoomedHd.removeAttribute("srcset"),S.zoomedHd.removeAttribute("sizes"),S.zoomedHd.src=S.zoomed.getAttribute("data-zoom-src"),S.zoomedHd.onerror=function(){clearInterval(a),console.warn("Unable to reach the zoom image target "+S.zoomedHd.src),S.zoomedHd=null,n()};var a=setInterval((function(){S.zoomedHd.complete&&(clearInterval(a),S.zoomedHd.classList.add("medium-zoom-image--opened"),S.zoomedHd.addEventListener("click",h),document.body.appendChild(S.zoomedHd),n())}),10)}else if(S.original.hasAttribute("srcset")){S.zoomedHd=S.zoomed.cloneNode(),S.zoomedHd.removeAttribute("sizes"),S.zoomedHd.removeAttribute("loading");var i=S.zoomedHd.addEventListener("load",(function(){S.zoomedHd.removeEventListener("load",i),S.zoomedHd.classList.add("medium-zoom-image--opened"),S.zoomedHd.addEventListener("click",h),document.body.appendChild(S.zoomedHd),n()}))}else n()}}}))},h=function(){return new r((function(e){if(!x&&S.original){x=!0,document.body.classList.remove("medium-zoom--opened"),S.zoomed.style.transform="",S.zoomedHd&&(S.zoomedHd.style.transform=""),S.template&&(S.template.style.transition="opacity 150ms",S.template.style.opacity=0),S.original.dispatchEvent(Rt("medium-zoom:close",{detail:{zoom:O}})),S.zoomed.addEventListener("transitionend",(function t(){S.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(S.zoomed),S.zoomedHd&&document.body.removeChild(S.zoomedHd),document.body.removeChild(C),S.zoomed.classList.remove("medium-zoom-image--opened"),S.template&&document.body.removeChild(S.template),x=!1,S.zoomed.removeEventListener("transitionend",t),S.original.dispatchEvent(Rt("medium-zoom:closed",{detail:{zoom:O}})),S.original=null,S.zoomed=null,S.zoomedHd=null,S.template=null,e(O)}))}else e(O)}))},v=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.target;return S.original?h():d({target:t})},g=function(){return k},m=function(){return b},y=function(){return S.original},b=[],w=[],x=!1,_=0,k=n,S={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(t)?k=t:(t||"string"==typeof t)&&c(t),k=$t({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},k);var C=It(k.background);document.addEventListener("click",o),document.addEventListener("keyup",i),document.addEventListener("scroll",a),window.addEventListener("resize",h);var O={open:d,close:h,toggle:v,update:s,clone:l,attach:c,detach:u,on:p,off:f,getOptions:g,getImages:m,getZoomedImage:y};return O},Nt={data:function(){return{zoom:null}},mounted:function(){this.updateZoom()},updated:function(){this.updateZoom()},methods:{updateZoom:function(){var e=this;setTimeout((function(){e.zoom&&e.zoom.detach(),e.zoom=Dt(".theme-reco-content :not(a) > img",void 0)}),1e3)}}},Ft=(n(106),n(102)),zt=n.n(Ft),Ut={mounted:function(){var e=this;zt.a.configure({showSpinner:!1}),this.$router.beforeEach((function(e,t,n){e.path===t.path||a.default.component(e.name)||zt.a.start(),n()})),this.$router.afterEach((function(){zt.a.done(),e.isSidebarOpen=!1}))}},Bt=n(236),qt=n.n(Bt),Vt={mounted:function(){qt.a.polyfill()}},Ht=n(8),Qt=(n(137),{props:{parent:Object,code:String,options:{align:String,color:String,backgroundTransition:Boolean,backgroundColor:String,successText:String,staticIcon:Boolean}},data:function(){return{success:!1,originalBackground:null,originalTransition:null}},computed:{alignStyle:function(){var e={};return e[this.options.align]="7.5px",e},iconClass:function(){return this.options.staticIcon?"":"hover"}},mounted:function(){this.originalTransition=this.parent.style.transition,this.originalBackground=this.parent.style.background},beforeDestroy:function(){this.parent.style.transition=this.originalTransition,this.parent.style.background=this.originalBackground},methods:{hexToRgb:function(e){var t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null},copyToClipboard:function(e){var t=this;if(navigator.clipboard)navigator.clipboard.writeText(this.code).then((function(){t.setSuccessTransitions()}),(function(){}));else{var n=document.createElement("textarea");document.body.appendChild(n),n.value=this.code,n.select(),document.execCommand("Copy"),n.remove(),this.setSuccessTransitions()}},setSuccessTransitions:function(){var e=this;if(clearTimeout(this.successTimeout),this.options.backgroundTransition){this.parent.style.transition="background 350ms";var t=this.hexToRgb(this.options.backgroundColor);this.parent.style.background="rgba(".concat(t.r,", ").concat(t.g,", ").concat(t.b,", 0.1)")}this.success=!0,this.successTimeout=setTimeout((function(){e.options.backgroundTransition&&(e.parent.style.background=e.originalBackground,e.parent.style.transition=e.originalTransition),e.success=!1}),500)}}}),Wt=(n(376),n(7)),Jt=Object(Wt.a)(Qt,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"code-copy"},[n("svg",{class:e.iconClass,style:e.alignStyle,attrs:{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},on:{click:e.copyToClipboard}},[n("path",{attrs:{fill:"none",d:"M0 0h24v24H0z"}}),e._v(" "),n("path",{attrs:{fill:e.options.color,d:"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm-1 4l6 6v10c0 1.1-.9 2-2 2H7.99C6.89 23 6 22.1 6 21l.01-14c0-1.1.89-2 1.99-2h7zm-1 7h5.5L14 6.5V12z"}})]),e._v(" "),n("span",{class:e.success?"success":"",style:e.alignStyle},[e._v("\n "+e._s(e.options.successText)+"\n ")])])}),[],!1,null,"49140617",null).exports,Kt=(n(377),[_t,At,Nt,Ut,Vt,{updated:function(){this.update()},methods:{update:function(){setTimeout((function(){document.querySelectorAll('div[class*="language-"] pre').forEach((function(e){if(!e.classList.contains("code-copy-added")){var t=new(a.default.extend(Jt));t.options=Object(Ht.a)({},{align:"bottom",color:"#27b1ff",backgroundTransition:!0,backgroundColor:"#0075b8",successText:"Copied!",staticIcon:!1}),t.code=e.innerText,t.parent=e,t.$mount(),e.classList.add("code-copy-added"),e.appendChild(t.$el)}}))}),100)}}}]),Gt={name:"GlobalLayout",computed:{layout:function(){var e=this.getLayout();return mt("layout",e),a.default.component(e)}},methods:{getLayout:function(){if(this.$page.path){var e=this.$page.frontmatter.layout;return e&&(this.$vuepress.getLayoutAsyncComponent(e)||this.$vuepress.getVueComponent(e))?e:"Layout"}return"NotFound"}}},Yt=Object(Wt.a)(Gt,(function(){var e=this.$createElement;return(this._self._c||e)(this.layout,{tag:"component"})}),[],!1,null,null,null).exports;!function(e,t,n){var r;switch(t){case"components":e[t]||(e[t]={}),Object.assign(e[t],n);break;case"mixins":e[t]||(e[t]=[]),(r=e[t]).push.apply(r,Object(Ye.a)(n));break;default:throw new Error("Unknown option name.")}}(Yt,"mixins",Kt);var Xt=[{name:"v-4da69628",path:"/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-4da69628").then(n)}},{path:"/index.html",redirect:"/"},{name:"v-596412a3",path:"/category/data-structure/tree.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-596412a3").then(n)}},{name:"v-147c91e8",path:"/category/data-structure/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-147c91e8").then(n)}},{path:"/category/data-structure/index.html",redirect:"/category/data-structure/"},{name:"v-65a6bb79",path:"/category/database/oracle.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-65a6bb79").then(n)}},{name:"v-6e62fcdc",path:"/category/database/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-6e62fcdc").then(n)}},{path:"/category/database/index.html",redirect:"/category/database/"},{name:"v-e67597a2",path:"/category/devops/ansible.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-e67597a2").then(n)}},{name:"v-9c213422",path:"/category/database/mysql.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-9c213422").then(n)}},{name:"v-9afd68e4",path:"/category/devops/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-9afd68e4").then(n)}},{path:"/category/devops/index.html",redirect:"/category/devops/"},{name:"v-6ff39fcd",path:"/category/database/postgresql.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-6ff39fcd").then(n)}},{name:"v-51483fa7",path:"/category/devops/atguigu_docker.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-51483fa7").then(n)}},{name:"v-7022cea2",path:"/category/database/sql.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-7022cea2").then(n)}},{name:"v-af3283e2",path:"/category/devops/atguigu_ShardingSphere5.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-af3283e2").then(n)}},{name:"v-23544f2f",path:"/category/devops/bat_shell.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-23544f2f").then(n)}},{name:"v-795d1e6f",path:"/category/devops/aliyun_docker_nginx.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-795d1e6f").then(n)}},{name:"v-769e1d81",path:"/category/devops/docker_redis.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-769e1d81").then(n)}},{name:"v-573687b9",path:"/category/devops/docker.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-573687b9").then(n)}},{name:"v-73606efa",path:"/category/devops/gitlab.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-73606efa").then(n)}},{name:"v-58dfedef",path:"/category/devops/git.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-58dfedef").then(n)}},{name:"v-1876b22a",path:"/category/devops/gradle.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-1876b22a").then(n)}},{name:"v-365942ea",path:"/category/devops/idea.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-365942ea").then(n)}},{name:"v-a7177b82",path:"/category/devops/jdk_source_compile.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-a7177b82").then(n)}},{name:"v-ad850a22",path:"/category/devops/jenkins.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-ad850a22").then(n)}},{name:"v-994a2be2",path:"/category/devops/maven-surefire-plugin.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-994a2be2").then(n)}},{name:"v-40365722",path:"/category/devops/k8s.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-40365722").then(n)}},{name:"v-32f558ef",path:"/category/devops/linux_deploy_webapp.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-32f558ef").then(n)}},{name:"v-f06bc1e2",path:"/category/devops/maven.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-f06bc1e2").then(n)}},{name:"v-7d944daf",path:"/category/devops/shell_files.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-7d944daf").then(n)}},{name:"v-216f4f6f",path:"/category/devops/shell.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-216f4f6f").then(n)}},{name:"v-11663be3",path:"/category/devops/nodejs.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-11663be3").then(n)}},{name:"v-6024e91e",path:"/category/devops/tomcat.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-6024e91e").then(n)}},{name:"v-35439c93",path:"/category/devops/typora.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-35439c93").then(n)}},{name:"v-9843a6b6",path:"/category/devops/vscode.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-9843a6b6").then(n)}},{name:"v-5667600f",path:"/category/devops/sonar.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-5667600f").then(n)}},{name:"v-775fb0fc",path:"/category/front-end-development/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-775fb0fc").then(n)}},{path:"/category/front-end-development/index.html",redirect:"/category/front-end-development/"},{name:"v-0407a904",path:"/category/java/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-0407a904").then(n)}},{path:"/category/java/index.html",redirect:"/category/java/"},{name:"v-c142182e",path:"/category/front-end-development/modularity.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-c142182e").then(n)}},{name:"v-e8b873a2",path:"/category/java/CompletableFuture.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-e8b873a2").then(n)}},{name:"v-8bb6c1e2",path:"/category/devops/windows.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-8bb6c1e2").then(n)}},{name:"v-13441367",path:"/category/java/date.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-13441367").then(n)}},{name:"v-d8759ade",path:"/category/front-end-development/webpack.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-d8759ade").then(n)}},{name:"v-10aa3aa9",path:"/category/java/mybatis/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-10aa3aa9").then(n)}},{path:"/category/java/mybatis/index.html",redirect:"/category/java/mybatis/"},{name:"v-38951577",path:"/category/java/io.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-38951577").then(n)}},{name:"v-cfee443a",path:"/category/java/java-jar.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-cfee443a").then(n)}},{name:"v-ba305d7e",path:"/category/java/jvm-tuning.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-ba305d7e").then(n)}},{name:"v-6c01f487",path:"/category/java/multi-thread.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-6c01f487").then(n)}},{name:"v-5f47816f",path:"/category/java/servlet.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-5f47816f").then(n)}},{name:"v-236e4b6f",path:"/category/java/jdk.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-236e4b6f").then(n)}},{name:"v-405ccd6f",path:"/category/java/jvm.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-405ccd6f").then(n)}},{name:"v-6a42fdbc",path:"/category/java/mybatis/mybatis.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-6a42fdbc").then(n)}},{name:"v-ace41292",path:"/category/linux/command.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-ace41292").then(n)}},{name:"v-c26696ae",path:"/category/linux/cp.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-c26696ae").then(n)}},{name:"v-bd6f557a",path:"/category/java/stream.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-bd6f557a").then(n)}},{name:"v-65d68009",path:"/category/linux/ftp.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-65d68009").then(n)}},{name:"v-74987d65",path:"/category/linux/file-management.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-74987d65").then(n)}},{name:"v-e7ff6efe",path:"/category/linux/package-manager.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-e7ff6efe").then(n)}},{name:"v-7c323989",path:"/category/linux/ln.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-7c323989").then(n)}},{name:"v-4cbd3a29",path:"/category/linux/traverse-and-execute-scripts.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-4cbd3a29").then(n)}},{name:"v-11d8a738",path:"/category/middleware/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-11d8a738").then(n)}},{path:"/category/middleware/index.html",redirect:"/category/middleware/"},{name:"v-c6899e26",path:"/category/linux/shell.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-c6899e26").then(n)}},{name:"v-6d2742e9",path:"/category/linux/user-and-group.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-6d2742e9").then(n)}},{name:"v-3d63be0f",path:"/category/middleware/activemq.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-3d63be0f").then(n)}},{name:"v-ffcfe472",path:"/category/middleware/apache.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-ffcfe472").then(n)}},{name:"v-ffed75a2",path:"/category/middleware/docker-rabbitmq.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-ffed75a2").then(n)}},{name:"v-7ab54286",path:"/category/linux/ssh.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-7ab54286").then(n)}},{name:"v-0f7abfe2",path:"/category/middleware/nginx.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-0f7abfe2").then(n)}},{name:"v-5f2c0232",path:"/category/middleware/rabbitmq.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-5f2c0232").then(n)}},{name:"v-7407ac37",path:"/category/middleware/redis1.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-7407ac37").then(n)}},{name:"v-65a04ebc",path:"/category/linux/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-65a04ebc").then(n)}},{path:"/category/linux/index.html",redirect:"/category/linux/"},{name:"v-2c088596",path:"/category/middleware/redis2.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-2c088596").then(n)}},{name:"v-22eef1cf",path:"/category/middleware/zookeeper.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-22eef1cf").then(n)}},{name:"v-657fc160",path:"/category/python/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-657fc160").then(n)}},{path:"/category/python/index.html",redirect:"/category/python/"},{name:"v-2ea49e47",path:"/category/spring/@ConfigurationProperties.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-2ea49e47").then(n)}},{name:"v-473c041a",path:"/category/python/python-automated-testing.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-473c041a").then(n)}},{name:"v-380e1338",path:"/category/testing-frameworks/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-380e1338").then(n)}},{path:"/category/testing-frameworks/index.html",redirect:"/category/testing-frameworks/"},{name:"v-d87f35e2",path:"/category/testing-frameworks/swagger.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-d87f35e2").then(n)}},{name:"v-3ca80b68",path:"/category/wiki/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-3ca80b68").then(n)}},{path:"/category/wiki/index.html",redirect:"/category/wiki/"},{name:"v-45a79697",path:"/category/testing-frameworks/cucumber.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-45a79697").then(n)}},{name:"v-b18a22e2",path:"/category/testing-frameworks/junit.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-b18a22e2").then(n)}},{name:"v-7777688f",path:"/category/wiki/cache.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-7777688f").then(n)}},{name:"v-c30d6fd6",path:"/category/testing-frameworks/allure.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-c30d6fd6").then(n)}},{name:"v-3d0a2735",path:"/category/wiki/fqdn.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-3d0a2735").then(n)}},{name:"v-3bd6109a",path:"/category/wiki/conversion.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-3bd6109a").then(n)}},{name:"v-627f45e2",path:"/category/wiki/isolation.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-627f45e2").then(n)}},{name:"v-000728af",path:"/category/wiki/mail-server.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-000728af").then(n)}},{name:"v-612c185a",path:"/category/wiki/mail-server-test.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-612c185a").then(n)}},{name:"v-ebbc0e96",path:"/category/wiki/optimistic-pessimistic-locking.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-ebbc0e96").then(n)}},{name:"v-b5c38f26",path:"/category/wiki/query_fqdn_ips.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-b5c38f26").then(n)}},{name:"v-4f836b11",path:"/category/wiki/smtp-pop3-imap.html",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-4f836b11").then(n)}},{name:"v-b1564aac",path:"/tag/",component:Yt,beforeEnter:function(e,t,n){gt("Tags","v-b1564aac").then(n)},meta:{pid:"tags",id:"tags"}},{path:"/tag/index.html",redirect:"/tag/"},{name:"v-ef9325c4",path:"/categories/",component:Yt,beforeEnter:function(e,t,n){gt("FrontmatterKey","v-ef9325c4").then(n)},meta:{pid:"categories",id:"categories"}},{path:"/categories/index.html",redirect:"/categories/"},{name:"v-6319eb4e",path:"/timeline/",component:Yt,beforeEnter:function(e,t,n){gt("TimeLines","v-6319eb4e").then(n)},meta:{pid:"timeline",id:"timeline"}},{path:"/timeline/index.html",redirect:"/timeline/"},{name:"v-73e170ba",path:"/tag/树/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-73e170ba").then(n)},meta:{pid:"tags",id:"树"}},{path:"/tag/树/index.html",redirect:"/tag/树/"},{name:"v-0903fc67",path:"/tag/Oracle/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-0903fc67").then(n)},meta:{pid:"tags",id:"Oracle"}},{path:"/tag/Oracle/index.html",redirect:"/tag/Oracle/"},{name:"v-60254b1e",path:"/tag/PostgreSQL/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-60254b1e").then(n)},meta:{pid:"tags",id:"PostgreSQL"}},{path:"/tag/PostgreSQL/index.html",redirect:"/tag/PostgreSQL/"},{name:"v-dc3c2992",path:"/tag/MySQL/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-dc3c2992").then(n)},meta:{pid:"tags",id:"MySQL"}},{path:"/tag/MySQL/index.html",redirect:"/tag/MySQL/"},{name:"v-e8d97cca",path:"/tag/H2/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-e8d97cca").then(n)},meta:{pid:"tags",id:"H2"}},{path:"/tag/H2/index.html",redirect:"/tag/H2/"},{name:"v-96cce67e",path:"/tag/Ansible/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-96cce67e").then(n)},meta:{pid:"tags",id:"Ansible"}},{path:"/tag/Ansible/index.html",redirect:"/tag/Ansible/"},{name:"v-83bebff6",path:"/tag/Docker/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-83bebff6").then(n)},meta:{pid:"tags",id:"Docker"}},{path:"/tag/Docker/index.html",redirect:"/tag/Docker/"},{name:"v-324b2c2a",path:"/tag/SQL/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-324b2c2a").then(n)},meta:{pid:"tags",id:"SQL"}},{path:"/tag/SQL/index.html",redirect:"/tag/SQL/"},{name:"v-7dca53d8",path:"/tag/ShardingSphere/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-7dca53d8").then(n)},meta:{pid:"tags",id:"ShardingSphere"}},{path:"/tag/ShardingSphere/index.html",redirect:"/tag/ShardingSphere/"},{name:"v-325b16f8",path:"/tag/BAT/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-325b16f8").then(n)},meta:{pid:"tags",id:"BAT"}},{path:"/tag/BAT/index.html",redirect:"/tag/BAT/"},{name:"v-c98ff16e",path:"/tag/Shell/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-c98ff16e").then(n)},meta:{pid:"tags",id:"Shell"}},{path:"/tag/Shell/index.html",redirect:"/tag/Shell/"},{name:"v-dab8e1c2",path:"/tag/Nginx/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-dab8e1c2").then(n)},meta:{pid:"tags",id:"Nginx"}},{path:"/tag/Nginx/index.html",redirect:"/tag/Nginx/"},{name:"v-cd4f2d44",path:"/tag/Redis/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-cd4f2d44").then(n)},meta:{pid:"tags",id:"Redis"}},{path:"/tag/Redis/index.html",redirect:"/tag/Redis/"},{name:"v-c8d3ff88",path:"/tag/ElasticSearch/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-c8d3ff88").then(n)},meta:{pid:"tags",id:"ElasticSearch"}},{path:"/tag/ElasticSearch/index.html",redirect:"/tag/ElasticSearch/"},{name:"v-0cdb3964",path:"/tag/FastDFS/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-0cdb3964").then(n)},meta:{pid:"tags",id:"FastDFS"}},{path:"/tag/FastDFS/index.html",redirect:"/tag/FastDFS/"},{name:"v-1797fbb4",path:"/tag/Naco/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-1797fbb4").then(n)},meta:{pid:"tags",id:"Naco"}},{path:"/tag/Naco/index.html",redirect:"/tag/Naco/"},{name:"v-5377a52a",path:"/tag/GitLab/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-5377a52a").then(n)},meta:{pid:"tags",id:"GitLab"}},{path:"/tag/GitLab/index.html",redirect:"/tag/GitLab/"},{name:"v-32555732",path:"/tag/Git/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-32555732").then(n)},meta:{pid:"tags",id:"Git"}},{path:"/tag/Git/index.html",redirect:"/tag/Git/"},{name:"v-61d296be",path:"/tag/Gradle/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-61d296be").then(n)},meta:{pid:"tags",id:"Gradle"}},{path:"/tag/Gradle/index.html",redirect:"/tag/Gradle/"},{name:"v-184030a4",path:"/tag/IDEA/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-184030a4").then(n)},meta:{pid:"tags",id:"IDEA"}},{path:"/tag/IDEA/index.html",redirect:"/tag/IDEA/"},{name:"v-18082c7a",path:"/tag/Java/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-18082c7a").then(n)},meta:{pid:"tags",id:"Java"}},{path:"/tag/Java/index.html",redirect:"/tag/Java/"},{name:"v-77033703",path:"/tag/Jenkins/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-77033703").then(n)},meta:{pid:"tags",id:"Jenkins"}},{path:"/tag/Jenkins/index.html",redirect:"/tag/Jenkins/"},{name:"v-dec02164",path:"/tag/Maven/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-dec02164").then(n)},meta:{pid:"tags",id:"Maven"}},{path:"/tag/Maven/index.html",redirect:"/tag/Maven/"},{name:"v-32532c1a",path:"/tag/K8S/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-32532c1a").then(n)},meta:{pid:"tags",id:"K8S"}},{path:"/tag/K8S/index.html",redirect:"/tag/K8S/"},{name:"v-e14f25f6",path:"/tag/Linux/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-e14f25f6").then(n)},meta:{pid:"tags",id:"Linux"}},{path:"/tag/Linux/index.html",redirect:"/tag/Linux/"},{name:"v-0d0d8d61",path:"/tag/Tomcat/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-0d0d8d61").then(n)},meta:{pid:"tags",id:"Tomcat"}},{path:"/tag/Tomcat/index.html",redirect:"/tag/Tomcat/"},{name:"v-160656e4",path:"/tag/Node.js/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-160656e4").then(n)},meta:{pid:"tags",id:"Node.js"}},{path:"/tag/Node.js/index.html",redirect:"/tag/Node.js/"},{name:"v-3231af64",path:"/tag/npm/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-3231af64").then(n)},meta:{pid:"tags",id:"npm"}},{path:"/tag/npm/index.html",redirect:"/tag/npm/"},{name:"v-c8c2cad4",path:"/tag/Sonar/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-c8c2cad4").then(n)},meta:{pid:"tags",id:"Sonar"}},{path:"/tag/Sonar/index.html",redirect:"/tag/Sonar/"},{name:"v-21192a6f",path:"/tag/SonarQube/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-21192a6f").then(n)},meta:{pid:"tags",id:"SonarQube"}},{path:"/tag/SonarQube/index.html",redirect:"/tag/SonarQube/"},{name:"v-3253bcb0",path:"/tag/JDK/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-3253bcb0").then(n)},meta:{pid:"tags",id:"JDK"}},{path:"/tag/JDK/index.html",redirect:"/tag/JDK/"},{name:"v-88bd8cf4",path:"/tag/Mybatis/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-88bd8cf4").then(n)},meta:{pid:"tags",id:"Mybatis"}},{path:"/tag/Mybatis/index.html",redirect:"/tag/Mybatis/"},{name:"v-c430aa8a",path:"/tag/ActiveMQ/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-c430aa8a").then(n)},meta:{pid:"tags",id:"ActiveMQ"}},{path:"/tag/ActiveMQ/index.html",redirect:"/tag/ActiveMQ/"},{name:"v-2102fe97",path:"/tag/Apache/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-2102fe97").then(n)},meta:{pid:"tags",id:"Apache"}},{path:"/tag/Apache/index.html",redirect:"/tag/Apache/"},{name:"v-3c438db2",path:"/tag/RabbitMQ/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-3c438db2").then(n)},meta:{pid:"tags",id:"RabbitMQ"}},{path:"/tag/RabbitMQ/index.html",redirect:"/tag/RabbitMQ/"},{name:"v-3d617f11",path:"/tag/VMware/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-3d617f11").then(n)},meta:{pid:"tags",id:"VMware"}},{path:"/tag/VMware/index.html",redirect:"/tag/VMware/"},{name:"v-15909639",path:"/tag/centos/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-15909639").then(n)},meta:{pid:"tags",id:"centos"}},{path:"/tag/centos/index.html",redirect:"/tag/centos/"},{name:"v-6dfb9784",path:"/tag/ubuntu/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-6dfb9784").then(n)},meta:{pid:"tags",id:"ubuntu"}},{path:"/tag/ubuntu/index.html",redirect:"/tag/ubuntu/"},{name:"v-87dcfee6",path:"/tag/zookeeper/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-87dcfee6").then(n)},meta:{pid:"tags",id:"zookeeper"}},{path:"/tag/zookeeper/index.html",redirect:"/tag/zookeeper/"},{name:"v-4aea34c9",path:"/tag/Python/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-4aea34c9").then(n)},meta:{pid:"tags",id:"Python"}},{path:"/tag/Python/index.html",redirect:"/tag/Python/"},{name:"v-309f60ec",path:"/tag/pytest/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-309f60ec").then(n)},meta:{pid:"tags",id:"pytest"}},{path:"/tag/pytest/index.html",redirect:"/tag/pytest/"},{name:"v-96d7b5b2",path:"/tag/selenium/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-96d7b5b2").then(n)},meta:{pid:"tags",id:"selenium"}},{path:"/tag/selenium/index.html",redirect:"/tag/selenium/"},{name:"v-527ac77a",path:"/tag/自动化测试/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-527ac77a").then(n)},meta:{pid:"tags",id:"自动化测试"}},{path:"/tag/自动化测试/index.html",redirect:"/tag/自动化测试/"},{name:"v-cdc56e72",path:"/tag/接口测试/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-cdc56e72").then(n)},meta:{pid:"tags",id:"接口测试"}},{path:"/tag/接口测试/index.html",redirect:"/tag/接口测试/"},{name:"v-46031d55",path:"/tag/单元测试/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-46031d55").then(n)},meta:{pid:"tags",id:"单元测试"}},{path:"/tag/单元测试/index.html",redirect:"/tag/单元测试/"},{name:"v-ea568faa",path:"/tag/JUnit/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-ea568faa").then(n)},meta:{pid:"tags",id:"JUnit"}},{path:"/tag/JUnit/index.html",redirect:"/tag/JUnit/"},{name:"v-a6405542",path:"/tag/Mockito/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-a6405542").then(n)},meta:{pid:"tags",id:"Mockito"}},{path:"/tag/Mockito/index.html",redirect:"/tag/Mockito/"},{name:"v-82f577ac",path:"/tag/PowerMock/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-82f577ac").then(n)},meta:{pid:"tags",id:"PowerMock"}},{path:"/tag/PowerMock/index.html",redirect:"/tag/PowerMock/"},{name:"v-4bb4ec90",path:"/tag/Spring/",component:Yt,beforeEnter:function(e,t,n){gt("Tag","v-4bb4ec90").then(n)},meta:{pid:"tags",id:"Spring"}},{path:"/tag/Spring/index.html",redirect:"/tag/Spring/"},{name:"v-95b1bb54",path:"/categories/数据结构/",component:Yt,beforeEnter:function(e,t,n){gt("Category","v-95b1bb54").then(n)},meta:{pid:"categories",id:"数据结构"}},{path:"/categories/数据结构/index.html",redirect:"/categories/数据结构/"},{name:"v-572671c3",path:"/categories/数据库/",component:Yt,beforeEnter:function(e,t,n){gt("Category","v-572671c3").then(n)},meta:{pid:"categories",id:"数据库"}},{path:"/categories/数据库/index.html",redirect:"/categories/数据库/"},{name:"v-88a44b18",path:"/categories/DevOps/",component:Yt,beforeEnter:function(e,t,n){gt("Category","v-88a44b18").then(n)},meta:{pid:"categories",id:"DevOps"}},{path:"/categories/DevOps/index.html",redirect:"/categories/DevOps/"},{name:"v-b7ee3692",path:"/categories/编程语言/",component:Yt,beforeEnter:function(e,t,n){gt("Category","v-b7ee3692").then(n)},meta:{pid:"categories",id:"编程语言"}},{path:"/categories/编程语言/index.html",redirect:"/categories/编程语言/"},{name:"v-667f2e23",path:"/categories/前端开发/",component:Yt,beforeEnter:function(e,t,n){gt("Category","v-667f2e23").then(n)},meta:{pid:"categories",id:"前端开发"}},{path:"/categories/前端开发/index.html",redirect:"/categories/前端开发/"},{name:"v-9b5f3d42",path:"/categories/操作系统/",component:Yt,beforeEnter:function(e,t,n){gt("Category","v-9b5f3d42").then(n)},meta:{pid:"categories",id:"操作系统"}},{path:"/categories/操作系统/index.html",redirect:"/categories/操作系统/"},{name:"v-ab31fcde",path:"/categories/中间件/",component:Yt,beforeEnter:function(e,t,n){gt("Category","v-ab31fcde").then(n)},meta:{pid:"categories",id:"中间件"}},{path:"/categories/中间件/index.html",redirect:"/categories/中间件/"},{name:"v-3077e678",path:"/categories/Spring/",component:Yt,beforeEnter:function(e,t,n){gt("Category","v-3077e678").then(n)},meta:{pid:"categories",id:"Spring"}},{path:"/categories/Spring/index.html",redirect:"/categories/Spring/"},{name:"v-b6d05696",path:"/categories/测试框架/",component:Yt,beforeEnter:function(e,t,n){gt("Category","v-b6d05696").then(n)},meta:{pid:"categories",id:"测试框架"}},{path:"/categories/测试框架/index.html",redirect:"/categories/测试框架/"},{name:"v-22a7942c",path:"/categories/计算机术语/",component:Yt,beforeEnter:function(e,t,n){gt("Category","v-22a7942c").then(n)},meta:{pid:"categories",id:"计算机术语"}},{path:"/categories/计算机术语/index.html",redirect:"/categories/计算机术语/"},{name:"v-61d4a47e",path:"/categories/Mail server/",component:Yt,beforeEnter:function(e,t,n){gt("Category","v-61d4a47e").then(n)},meta:{pid:"categories",id:"Mail server"}},{path:"/categories/Mail server/index.html",redirect:"/categories/Mail server/"},{name:"v-e3c98acc",path:"/tag/Java/page/2/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-e3c98acc").then(n)},meta:{pid:"tags",id:"Java"}},{path:"/tag/Java/page/2/index.html",redirect:"/tag/Java/page/2/"},{name:"v-957a2dd0",path:"/tag/Linux/page/2/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-957a2dd0").then(n)},meta:{pid:"tags",id:"Linux"}},{path:"/tag/Linux/page/2/index.html",redirect:"/tag/Linux/page/2/"},{name:"v-4be95e6e",path:"/categories/DevOps/page/2/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-4be95e6e").then(n)},meta:{pid:"categories",id:"DevOps"}},{path:"/categories/DevOps/page/2/index.html",redirect:"/categories/DevOps/page/2/"},{name:"v-4be95e30",path:"/categories/DevOps/page/3/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-4be95e30").then(n)},meta:{pid:"categories",id:"DevOps"}},{path:"/categories/DevOps/page/3/index.html",redirect:"/categories/DevOps/page/3/"},{name:"v-3e0075b4",path:"/categories/编程语言/page/2/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-3e0075b4").then(n)},meta:{pid:"categories",id:"编程语言"}},{path:"/categories/编程语言/page/2/index.html",redirect:"/categories/编程语言/page/2/"},{name:"v-7b4b8904",path:"/categories/操作系统/page/2/",component:Yt,beforeEnter:function(e,t,n){gt("Layout","v-7b4b8904").then(n)},meta:{pid:"categories",id:"操作系统"}},{path:"/categories/操作系统/page/2/index.html",redirect:"/categories/操作系统/page/2/"},{path:"*",component:Yt}],Zt={title:"初冬十月的笔记",description:"初冬十月的笔记努力加载中~~",base:"/",headTags:[["link",{rel:"icon",href:"/favicon.ico"}],["meta",{name:"viewport",content:"width=device-width,initial-scale=1,user-scalable=no"}],["meta",{name:"keywords",content:"初冬十月,maiaimei,maiamy,maiam"}],["meta",{name:"description",content:"初冬十月的笔记,一个从事软件开发的妹子,怀着不断学习的心态期待与广大同行交流。"}],["script",{},'\n\t\t var _hmt = _hmt || [];\n\t\t (function() {\n\t\t var hm = document.createElement("script");\n\t\t hm.src = "https://hm.baidu.com/hm.js?ea067d5ff639c55d3843c3f224a1c187";\n\t\t var s = document.getElementsByTagName("script")[0]; \n\t\t s.parentNode.insertBefore(hm, s);\n\t\t })();\n\t\t ']],pages:[{title:"Home",frontmatter:{home:!0,heroText:null,tagline:null,bgImage:"/bg.jpg"},regularPath:"/",relativePath:"README.md",key:"v-4da69628",path:"/"},{title:"树",frontmatter:{title:"树",date:"2023-04-30",categories:["数据结构"],tags:["树"],sidebar:"auto",publish:!0},regularPath:"/category/data-structure/tree.html",relativePath:"category/data-structure/tree.md",key:"v-596412a3",path:"/category/data-structure/tree.html",headers:[{level:2,title:"树的概念",slug:"树的概念"},{level:2,title:"树的分类",slug:"树的分类"},{level:3,title:"查找树",slug:"查找树"},{level:3,title:"无序树",slug:"无序树"},{level:3,title:"多叉树",slug:"多叉树"},{level:3,title:"二叉树",slug:"二叉树"},{level:2,title:"森林",slug:"森林"},{level:2,title:"相关链接",slug:"相关链接"}]},{title:"数据结构",frontmatter:{title:"数据结构",date:"2024-02-14",categories:["数据结构"],sidebar:"auto",publish:!0},regularPath:"/category/data-structure/",relativePath:"category/data-structure/README.md",key:"v-147c91e8",path:"/category/data-structure/"},{title:"Oracle学习笔记",frontmatter:{title:"Oracle学习笔记",date:"2024-04-23",categories:["数据库"],tags:["Oracle"],sidebar:"auto",publish:!0},regularPath:"/category/database/oracle.html",relativePath:"category/database/oracle.md",key:"v-65a6bb79",path:"/category/database/oracle.html",headers:[{level:2,title:"DDL",slug:"ddl"},{level:2,title:"数据类型",slug:"数据类型"},{level:3,title:"number(p,s)",slug:"number-p-s"},{level:2,title:"内置函数",slug:"内置函数"},{level:3,title:"单行函数",slug:"单行函数"},{level:3,title:"多行函数",slug:"多行函数"},{level:2,title:"分页查询",slug:"分页查询"}]},{title:"数据库学习笔记",frontmatter:{title:"数据库学习笔记",date:"2022-11-20",categories:["数据库"],tags:["PostgreSQL","Oracle","MySQL","H2"],sidebar:"auto",publish:!0},regularPath:"/category/database/",relativePath:"category/database/README.md",key:"v-6e62fcdc",path:"/category/database/",headers:[{level:2,title:"Oracle",slug:"oracle"},{level:2,title:"MySQL",slug:"mysql"},{level:2,title:"PostgreSQL",slug:"postgresql"},{level:2,title:"H2",slug:"h2"},{level:2,title:"数据类型",slug:"数据类型"},{level:2,title:"数据库操作",slug:"数据库操作"},{level:2,title:"数据表操作",slug:"数据表操作"}]},{title:"Ansible学习笔记",frontmatter:{title:"Ansible学习笔记",date:"2024-09-02",categories:["DevOps"],tags:["Ansible"],sidebar:"auto",publish:!0},regularPath:"/category/devops/ansible.html",relativePath:"category/devops/ansible.md",key:"v-e67597a2",path:"/category/devops/ansible.html",headers:[{level:2,title:"Ansible的三大组件",slug:"ansible的三大组件"},{level:2,title:"Ansible的安装部署",slug:"ansible的安装部署"},{level:3,title:"Control node requirements",slug:"control-node-requirements"},{level:3,title:"Managed node requirements",slug:"managed-node-requirements"},{level:2,title:"Ansible的目录结构",slug:"ansible的目录结构"},{level:2,title:"Ansible的配置文件",slug:"ansible的配置文件"},{level:2,title:"Ansible的命令",slug:"ansible的命令"},{level:3,title:"ansible",slug:"ansible"},{level:3,title:"ansible-playbook",slug:"ansible-playbook"},{level:3,title:"ansible-doc",slug:"ansible-doc"},{level:2,title:"Ansible的模块",slug:"ansible的模块"},{level:3,title:"debug模块",slug:"debug模块"},{level:3,title:"command模块‌",slug:"command模块‌"},{level:3,title:"shell模块",slug:"shell模块"},{level:3,title:"script模块",slug:"script模块"},{level:3,title:"file模块",slug:"file模块"},{level:3,title:"template模块",slug:"template模块"},{level:3,title:"copy模块‌ 和 ‌fetch模块‌",slug:"copy模块‌-和-‌fetch模块‌"},{level:3,title:"archive模块‌ 和 ‌unarchive模块‌",slug:"archive模块‌-和-‌unarchive模块‌"},{level:3,title:"其他模块",slug:"其他模块"},{level:2,title:"Ansible的示例",slug:"ansible的示例"},{level:2,title:"Python API",slug:"python-api"},{level:2,title:"参考资料",slug:"参考资料"}]},{title:"MySQL学习笔记",frontmatter:{title:"MySQL学习笔记",date:"2021-10-17",categories:["数据库"],tags:["MySQL"],sidebar:"auto",publish:!0},regularPath:"/category/database/mysql.html",relativePath:"category/database/mysql.md",key:"v-9c213422",path:"/category/database/mysql.html",headers:[{level:2,title:"安装MySQL",slug:"安装mysql"},{level:3,title:"Windows安装MySQL",slug:"windows安装mysql"},{level:3,title:"Linux安装MySQL",slug:"linux安装mysql"},{level:3,title:"Docker安装MySQL",slug:"docker安装mysql"},{level:2,title:"基本命令",slug:"基本命令"},{level:3,title:"连接服务器",slug:"连接服务器"},{level:3,title:"断开服务器",slug:"断开服务器"},{level:3,title:"查看数据库",slug:"查看数据库"},{level:3,title:"创建数据库",slug:"创建数据库"},{level:3,title:"打开数据库",slug:"打开数据库"},{level:3,title:"导出数据库",slug:"导出数据库"},{level:3,title:"导入数据库",slug:"导入数据库"},{level:3,title:"查看数据表",slug:"查看数据表"},{level:3,title:"查看表结构",slug:"查看表结构"},{level:3,title:"查看版本号",slug:"查看版本号"},{level:2,title:"备份与恢复",slug:"备份与恢复"},{level:3,title:"使用mysqldump 备份一个数据库",slug:"使用mysqldump-备份一个数据库"},{level:3,title:"使用mysqldump 备份一个数据库的若干表",slug:"使用mysqldump-备份一个数据库的若干表"},{level:3,title:"使用mysqldump 备份多个数据库",slug:"使用mysqldump-备份多个数据库"},{level:3,title:"使用mysql恢复备份文件",slug:"使用mysql恢复备份文件"},{level:2,title:"主从同步",slug:"主从同步"},{level:3,title:"准备主服务器",slug:"准备主服务器"},{level:3,title:"准备从服务器1",slug:"准备从服务器1"},{level:3,title:"准备从服务器2",slug:"准备从服务器2"},{level:3,title:"实现主从同步",slug:"实现主从同步"},{level:3,title:"准备测试脚本",slug:"准备测试脚本"},{level:2,title:"my.cnf",slug:"my-cnf"}]},{frontmatter:{},regularPath:"/category/devops/",relativePath:"category/devops/README.md",key:"v-9afd68e4",path:"/category/devops/"},{title:"PostgreSQL学习笔记",frontmatter:{title:"PostgreSQL学习笔记",date:"2022-11-20",categories:["数据库"],tags:["PostgreSQL"],sidebar:"auto",publish:!0},regularPath:"/category/database/postgresql.html",relativePath:"category/database/postgresql.md",key:"v-6ff39fcd",path:"/category/database/postgresql.html",headers:[{level:2,title:"在Linux下安装PostgreSQL",slug:"在linux下安装postgresql"},{level:2,title:"PostgreSQL 使用",slug:"postgresql-使用"}]},{title:"尚硅谷_Docker的安装与卸载",frontmatter:{title:"尚硅谷_Docker的安装与卸载",author:"尚硅谷",date:"2022-09-14",categories:["DevOps"],tags:["Docker"],sidebar:"auto",publish:!0},regularPath:"/category/devops/atguigu_docker.html",relativePath:"category/devops/atguigu_docker.md",key:"v-51483fa7",path:"/category/devops/atguigu_docker.html",headers:[{level:2,title:"一、安装准备",slug:"一、安装准备"},{level:3,title:"1、前提条件",slug:"_1、前提条件"},{level:3,title:"2、查看系统内核",slug:"_2、查看系统内核"},{level:3,title:"3、查看已安装的CentOS版本信息",slug:"_3、查看已安装的centos版本信息"},{level:2,title:"二、CentOS7安装docker",slug:"二、centos7安装docker"},{level:3,title:"1、安装需要的软件包",slug:"_1、安装需要的软件包"},{level:3,title:"2、设置docker下载镜像",slug:"_2、设置docker下载镜像"},{level:3,title:"3、更新yum软件包索引",slug:"_3、更新yum软件包索引"},{level:3,title:"4、安装docker ce",slug:"_4、安装docker-ce"},{level:3,title:"5、启动docker",slug:"_5、启动docker"},{level:3,title:"6、版本验证",slug:"_6、版本验证"},{level:3,title:"7、设置开机启动",slug:"_7、设置开机启动"},{level:2,title:"三、卸载",slug:"三、卸载"}]},{title:"SQL学习笔记",frontmatter:{title:"SQL学习笔记",date:"2024-04-23",categories:["数据库"],tags:["SQL"],sidebar:"auto",publish:!0},regularPath:"/category/database/sql.html",relativePath:"category/database/sql.md",key:"v-7022cea2",path:"/category/database/sql.html",headers:[{level:2,title:"DDL",slug:"ddl"},{level:3,title:"CREATE DATABASE",slug:"create-database"},{level:3,title:"ALTER DATABASE",slug:"alter-database"},{level:3,title:"DROP DATABASE",slug:"drop-database"},{level:3,title:"CREATE TABLE",slug:"create-table"},{level:3,title:"ALTER TABLE",slug:"alter-table"},{level:3,title:"DROP TABLE",slug:"drop-table"},{level:3,title:"TRUNCATE TABLE",slug:"truncate-table"},{level:3,title:"CREATE INDEX",slug:"create-index"},{level:3,title:"DROP INDEX",slug:"drop-index"},{level:3,title:"Constraints",slug:"constraints"},{level:2,title:"DML",slug:"dml"},{level:3,title:"SELECT",slug:"select"},{level:3,title:"INSERT INTO",slug:"insert-into"},{level:3,title:"UPDATE",slug:"update"},{level:3,title:"DELETE",slug:"delete"},{level:3,title:"WHERE",slug:"where"},{level:2,title:"函数",slug:"函数"},{level:3,title:"聚合函数",slug:"聚合函数"},{level:3,title:"Oracle 函数",slug:"oracle-函数"}]},{title:"尚硅谷_ShardingSphere5",frontmatter:{title:"尚硅谷_ShardingSphere5",author:"尚硅谷",date:"2022-09-14",tags:["ShardingSphere"],sidebar:"auto",publish:!0},regularPath:"/category/devops/atguigu_ShardingSphere5.html",relativePath:"category/devops/atguigu_ShardingSphere5.md",key:"v-af3283e2",path:"/category/devops/atguigu_ShardingSphere5.html",headers:[{level:2,title:"第01章 高性能架构模式",slug:"第01章-高性能架构模式"},{level:3,title:"1、读写分离架构",slug:"_1、读写分离架构"},{level:3,title:"2、数据库分片架构",slug:"_2、数据库分片架构"},{level:3,title:"3、读写分离和数据分片架构",slug:"_3、读写分离和数据分片架构"},{level:3,title:"4、实现方式",slug:"_4、实现方式"},{level:2,title:"第02章 ShardingSphere",slug:"第02章-shardingsphere"},{level:3,title:"1、简介",slug:"_1、简介"},{level:3,title:"2、ShardingSphere-JDBC",slug:"_2、shardingsphere-jdbc"},{level:3,title:"3、ShardingSphere-Proxy",slug:"_3、shardingsphere-proxy"},{level:2,title:"第03章 MySQL主从同步",slug:"第03章-mysql主从同步"},{level:3,title:"1、MySQL主从同步原理",slug:"_1、mysql主从同步原理"},{level:3,title:"2、一主多从配置",slug:"_2、一主多从配置"},{level:2,title:"第04章 ShardingSphere-JDBC读写分离",slug:"第04章-shardingsphere-jdbc读写分离"},{level:3,title:"1、创建SpringBoot程序",slug:"_1、创建springboot程序"},{level:3,title:"2、测试",slug:"_2、测试"},{level:2,title:"第05章 ShardingSphere-JDBC垂直分片",slug:"第05章-shardingsphere-jdbc垂直分片"},{level:3,title:"1、准备服务器",slug:"_1、准备服务器"},{level:3,title:"2、程序实现",slug:"_2、程序实现"},{level:3,title:"3、测试垂直分片",slug:"_3、测试垂直分片"},{level:2,title:"第06章 ShardingSphere-JDBC水平分片",slug:"第06章-shardingsphere-jdbc水平分片"},{level:3,title:"1、准备服务器",slug:"_1、准备服务器-2"},{level:3,title:"2、基本水平分片",slug:"_2、基本水平分片"},{level:3,title:"3、多表关联",slug:"_3、多表关联"},{level:3,title:"4、绑定表",slug:"_4、绑定表"},{level:3,title:"5、广播表",slug:"_5、广播表"},{level:2,title:"第07章 启动ShardingSphere-Proxy",slug:"第07章-启动shardingsphere-proxy"},{level:3,title:"1、获取",slug:"_1、获取"},{level:3,title:"2、使用二进制发布包安装",slug:"_2、使用二进制发布包安装"},{level:3,title:"3、使用Docker安装",slug:"_3、使用docker安装"},{level:2,title:"第08章 ShardingSphere-Proxy读写分离",slug:"第08章-shardingsphere-proxy读写分离"},{level:3,title:"1、修改配置文件",slug:"_1、修改配置文件"},{level:3,title:"2、实时查看日志",slug:"_2、实时查看日志"},{level:3,title:"3、远程访问测试",slug:"_3、远程访问测试"},{level:3,title:"4、应用程序访问Proxy",slug:"_4、应用程序访问proxy"},{level:2,title:"第09章 ShardingSphere-Proxy垂直分片",slug:"第09章-shardingsphere-proxy垂直分片"},{level:3,title:"1、修改配置文件",slug:"_1、修改配置文件-2"},{level:3,title:"2、实时查看日志",slug:"_2、实时查看日志-2"},{level:3,title:"3、远程访问测试",slug:"_3、远程访问测试-2"},{level:2,title:"第10章 ShardingSphere-Proxy水平分片",slug:"第10章-shardingsphere-proxy水平分片"},{level:3,title:"1、修改配置文件",slug:"_1、修改配置文件-3"},{level:3,title:"2、实时查看日志",slug:"_2、实时查看日志-3"},{level:3,title:"3、远程访问测试",slug:"_3、远程访问测试-3"}]},{title:"Windows的BAT批处理命令和Linux的Shell命令",frontmatter:{title:"Windows的BAT批处理命令和Linux的Shell命令",date:"2023-10-08",tags:["BAT","Shell"],sidebar:"auto",publish:!0},regularPath:"/category/devops/bat_shell.html",relativePath:"category/devops/bat_shell.md",key:"v-23544f2f",path:"/category/devops/bat_shell.html"},{title:"在阿里云上使用Docker部署静态站点",frontmatter:{title:"在阿里云上使用Docker部署静态站点",date:"2022-03-26",categories:["DevOps"],tags:["Docker","Nginx"],sidebar:"auto",publish:!0},regularPath:"/category/devops/aliyun_docker_nginx.html",relativePath:"category/devops/aliyun_docker_nginx.md",key:"v-795d1e6f",path:"/category/devops/aliyun_docker_nginx.html",headers:[{level:2,title:"准备工作",slug:"准备工作"},{level:3,title:"创建多个目录",slug:"创建多个目录"},{level:3,title:"创建配置文件 - nginx.conf",slug:"创建配置文件-nginx-conf"},{level:3,title:"创建配置文件 - default.conf",slug:"创建配置文件-default-conf"},{level:3,title:"上传静态页面",slug:"上传静态页面"},{level:3,title:"上传SSL证书",slug:"上传ssl证书"},{level:2,title:"启动容器",slug:"启动容器"}]},{title:"在Docker下安装Redis",frontmatter:{title:"在Docker下安装Redis",date:"2022-04-15",categories:["DevOps"],tags:["Docker"],sidebar:"auto",publish:!0},regularPath:"/category/devops/docker_redis.html",relativePath:"category/devops/docker_redis.md",key:"v-769e1d81",path:"/category/devops/docker_redis.html"},{title:"Docker学习笔记",frontmatter:{title:"Docker学习笔记",date:"2021-11-19",categories:["DevOps"],tags:["Docker","Nginx","Oracle","MySQL","Redis","ElasticSearch","FastDFS","Naco"],sidebar:"auto",publish:!0},regularPath:"/category/devops/docker.html",relativePath:"category/devops/docker.md",key:"v-573687b9",path:"/category/devops/docker.html",headers:[{level:2,title:"安装/升级Docker客户端",slug:"安装-升级docker客户端"},{level:3,title:"卸载docker",slug:"卸载docker"},{level:3,title:"安装docker",slug:"安装docker"},{level:3,title:"配置镜像加速器",slug:"配置镜像加速器"},{level:2,title:"Docker CLI",slug:"docker-cli"},{level:3,title:"docker search/pull/images/rmi",slug:"docker-search-pull-images-rmi"},{level:3,title:"docker inspect",slug:"docker-inspect"},{level:3,title:"docker build/tag/push",slug:"docker-build-tag-push"},{level:3,title:"docker cp",slug:"docker-cp"},{level:3,title:"docker network",slug:"docker-network"},{level:3,title:"docker run",slug:"docker-run"},{level:3,title:"docker exec",slug:"docker-exec"},{level:3,title:"docker ps/start/stop/rm/logs",slug:"docker-ps-start-stop-rm-logs"},{level:3,title:"docker container update",slug:"docker-container-update"},{level:2,title:"Dockerfile",slug:"dockerfile"},{level:3,title:"RUN、CMD和ENTRYPOINT异同点",slug:"run、cmd和entrypoint异同点"},{level:3,title:"COPY和ADD",slug:"copy和add"},{level:3,title:"ENV和ARG",slug:"env和arg"},{level:2,title:"Docker Compose",slug:"docker-compose"},{level:3,title:"编写 docker-compose.yml",slug:"编写-docker-compose-yml"},{level:3,title:"运行应用",slug:"运行应用"},{level:2,title:"Docker 安装 Nginx",slug:"docker-安装-nginx"},{level:2,title:"Docker 安装 Oracle",slug:"docker-安装-oracle"},{level:2,title:"Docker 安装 MySQL",slug:"docker-安装-mysql"},{level:2,title:"Docker 安装 Redis",slug:"docker-安装-redis"},{level:2,title:"Docker 安装 ElasticSearch",slug:"docker-安装-elasticsearch"},{level:2,title:"Docker 安装 FastDFS",slug:"docker-安装-fastdfs"},{level:2,title:"Docker 安装 Naco",slug:"docker-安装-naco"},{level:2,title:"云部署",slug:"云部署"},{level:3,title:"个人博客",slug:"个人博客"},{level:3,title:"若依微服务",slug:"若依微服务"}]},{title:"GitLab学习笔记",frontmatter:{title:"GitLab学习笔记",date:"2024-06-09",categories:["DevOps"],tags:["GitLab"],sidebar:"auto",publish:!0},regularPath:"/category/devops/gitlab.html",relativePath:"category/devops/gitlab.md",key:"v-73606efa",path:"/category/devops/gitlab.html",headers:[{level:2,title:"Install GitLab",slug:"install-gitlab"},{level:3,title:"Installation system requirements",slug:"installation-system-requirements"},{level:3,title:"Install GitLab by using Linux package",slug:"install-gitlab-by-using-linux-package"},{level:3,title:"Install GitLab by using Docker",slug:"install-gitlab-by-using-docker"},{level:3,title:"Configure GitLab",slug:"configure-gitlab"},{level:3,title:"Reset password",slug:"reset-password"},{level:2,title:"Use GitLab",slug:"use-gitlab"},{level:3,title:"Use SSH keys to communicate with GitLab",slug:"use-ssh-keys-to-communicate-with-gitlab"},{level:3,title:"Store Git data in an alternative directory",slug:"store-git-data-in-an-alternative-directory"},{level:2,title:"Reference",slug:"reference"}]},{title:"Git学习笔记",frontmatter:{title:"Git学习笔记",date:"2021-10-09",categories:["DevOps"],tags:["Git"],sidebar:"auto",publish:!0},regularPath:"/category/devops/git.html",relativePath:"category/devops/git.md",key:"v-58dfedef",path:"/category/devops/git.html",headers:[{level:2,title:"下载Git",slug:"下载git"},{level:2,title:"安装Git",slug:"安装git"},{level:2,title:"配置Git",slug:"配置git"},{level:2,title:"常用命令",slug:"常用命令"},{level:2,title:"工作流程",slug:"工作流程"},{level:2,title:"提交规范",slug:"提交规范"},{level:2,title:"其他问题",slug:"其他问题"},{level:2,title:"相关链接",slug:"相关链接"}]},{title:"Gradle学习笔记",frontmatter:{title:"Gradle学习笔记",date:"2021-12-04",categories:["DevOps"],tags:["Gradle"],sidebar:"auto",publish:!0},regularPath:"/category/devops/gradle.html",relativePath:"category/devops/gradle.md",key:"v-1876b22a",path:"/category/devops/gradle.html",headers:[{level:2,title:"Gradle安装及配置",slug:"gradle安装及配置"},{level:3,title:"安装Gradle",slug:"安装gradle"},{level:3,title:"配置Gradle",slug:"配置gradle"},{level:2,title:"Gradle常用命令",slug:"gradle常用命令"},{level:2,title:"Gradle项目文件",slug:"gradle项目文件"},{level:2,title:"Groovy安装及配置",slug:"groovy安装及配置"},{level:2,title:"相关链接",slug:"相关链接"}]},{title:"IDEA基本使用",frontmatter:{title:"IDEA基本使用",date:"2021-11-04",categories:["DevOps"],tags:["IDEA"],sidebar:"auto",publish:!0},regularPath:"/category/devops/idea.html",relativePath:"category/devops/idea.md",key:"v-365942ea",path:"/category/devops/idea.html",headers:[{level:2,title:"插件",slug:"插件"},{level:2,title:"快捷键",slug:"快捷键"},{level:2,title:"其他",slug:"其他"},{level:3,title:"自动生成序列化ID",slug:"自动生成序列化id"}]},{title:"编译JDK17源码",frontmatter:{title:"编译JDK17源码",date:"2023-04-28",categories:["编程语言"],tags:["Java"],sidebar:"auto",publish:!0},regularPath:"/category/devops/jdk_source_compile.html",relativePath:"category/devops/jdk_source_compile.md",key:"v-a7177b82",path:"/category/devops/jdk_source_compile.html",headers:[{level:2,title:"在Linux上编译JDK17源码",slug:"在linux上编译jdk17源码"},{level:2,title:"在Windows上编译JDK17源码(未通过)",slug:"在windows上编译jdk17源码-未通过"}]},{title:"Jenkins学习笔记",frontmatter:{title:"Jenkins学习笔记",date:"2024-07-11",categories:["DevOps"],tags:["Jenkins"],sidebar:"auto",publish:!0},regularPath:"/category/devops/jenkins.html",relativePath:"category/devops/jenkins.md",key:"v-ad850a22",path:"/category/devops/jenkins.html",headers:[{level:2,title:"Jenkins 是什么?",slug:"jenkins-是什么"},{level:2,title:"安装Jenkins",slug:"安装jenkins"},{level:3,title:"系统要求",slug:"系统要求"},{level:3,title:"使用war文件安装Jenkins",slug:"使用war文件安装jenkins"},{level:3,title:"使用yum命令安装Jenkins",slug:"使用yum命令安装jenkins"},{level:3,title:"安装后设置向导",slug:"安装后设置向导"},{level:2,title:"Jenkins免密登录远程服务器",slug:"jenkins免密登录远程服务器"},{level:2,title:"Jenkins常用插件",slug:"jenkins常用插件"},{level:3,title:"Role-based Authorization Strategy",slug:"role-based-authorization-strategy"},{level:3,title:"Pipeline",slug:"pipeline"},{level:3,title:"Pipeline Stage View",slug:"pipeline-stage-view"},{level:3,title:"SSH",slug:"ssh"},{level:3,title:"SSH Pipeline Steps",slug:"ssh-pipeline-steps"},{level:3,title:"Git",slug:"git"},{level:2,title:"Jenkins全局工具",slug:"jenkins全局工具"},{level:2,title:"流水线语法",slug:"流水线语法"},{level:3,title:"agent 指令",slug:"agent-指令"},{level:2,title:"Jenkinsfile 示例",slug:"jenkinsfile-示例"},{level:3,title:"免密登录远程服务器执行命令",slug:"免密登录远程服务器执行命令"},{level:3,title:"为远程服务器添加公钥",slug:"为远程服务器添加公钥"},{level:3,title:"构建-执行测试用例-部署",slug:"构建-执行测试用例-部署"},{level:3,title:"拉取源码-构建-执行测试用例-部署",slug:"拉取源码-构建-执行测试用例-部署"},{level:2,title:"部署项目",slug:"部署项目"},{level:3,title:"Jenkinsfile",slug:"jenkinsfile"},{level:3,title:"start.sh",slug:"start-sh"},{level:3,title:"stop.sh",slug:"stop-sh"},{level:3,title:"backup.sh",slug:"backup-sh"},{level:3,title:"rollback.sh",slug:"rollback-sh"},{level:3,title:"参数化构建",slug:"参数化构建"},{level:2,title:"部署问题",slug:"部署问题"},{level:3,title:"nohup: failed to run command ‘java’: No such file or directory",slug:"nohup-failed-to-run-command-java-no-such-file-or-directory"},{level:2,title:"参考资料",slug:"参考资料"}]},{title:"Maven配置JVM参数",frontmatter:{title:"Maven配置JVM参数",date:"2023-06-17",categories:["DevOps"],tags:["Maven"],sidebar:"auto",publish:!0},regularPath:"/category/devops/maven-surefire-plugin.html",relativePath:"category/devops/maven-surefire-plugin.md",key:"v-994a2be2",path:"/category/devops/maven-surefire-plugin.html"},{title:"K8S学习笔记",frontmatter:{title:"K8S学习笔记",date:"2022-10-05",categories:["DevOps"],tags:["K8S"],sidebar:"auto",publish:!0},regularPath:"/category/devops/k8s.html",relativePath:"category/devops/k8s.md",key:"v-40365722",path:"/category/devops/k8s.html",headers:[{level:2,title:"minikube",slug:"minikube"},{level:3,title:"Installation",slug:"installation"},{level:3,title:"Start your cluster",slug:"start-your-cluster"},{level:3,title:"Interact with your cluster",slug:"interact-with-your-cluster"},{level:3,title:"Deploy applications",slug:"deploy-applications"},{level:2,title:"Dashboard",slug:"dashboard"},{level:2,title:"Concepts",slug:"concepts"},{level:3,title:"kubectl",slug:"kubectl"},{level:3,title:"Namespace",slug:"namespace"},{level:3,title:"Pod",slug:"pod"},{level:3,title:"Deployment",slug:"deployment"},{level:3,title:"Service",slug:"service"},{level:3,title:"Ingress",slug:"ingress"},{level:3,title:"YAML",slug:"yaml"},{level:2,title:"Example",slug:"example"},{level:2,title:"Q&A",slug:"q-a"},{level:3,title:"Service类型",slug:"service类型"},{level:3,title:"Pod三种探针",slug:"pod三种探针"},{level:3,title:"访问Tomcat出现404",slug:"访问tomcat出现404"},{level:3,title:"修改Nginx首页",slug:"修改nginx首页"},{level:2,title:"Links",slug:"links"}]},{title:"在Linux上部署JavaWeb应用",frontmatter:{title:"在Linux上部署JavaWeb应用",date:"2021-02-01",categories:["DevOps"],tags:["Linux","Tomcat","Nginx","Redis","MySQL"],sidebar:"auto",publish:!0},regularPath:"/category/devops/linux_deploy_webapp.html",relativePath:"category/devops/linux_deploy_webapp.md",key:"v-32f558ef",path:"/category/devops/linux_deploy_webapp.html",headers:[{level:2,title:"环境准备",slug:"环境准备"},{level:3,title:"JDK",slug:"jdk"},{level:3,title:"Tomcat",slug:"tomcat"},{level:3,title:"MySQL",slug:"mysql"},{level:3,title:"Redis",slug:"redis"},{level:3,title:"Nginx",slug:"nginx"},{level:2,title:"应用部署",slug:"应用部署"},{level:2,title:"参考资料",slug:"参考资料"}]},{title:"Maven安装与配置",frontmatter:{title:"Maven安装与配置",date:"2021-10-10",categories:["DevOps"],tags:["Maven"],sidebar:"auto",publish:!0},regularPath:"/category/devops/maven.html",relativePath:"category/devops/maven.md",key:"v-f06bc1e2",path:"/category/devops/maven.html",headers:[{level:2,title:"安装",slug:"安装"},{level:2,title:"配置环境变量",slug:"配置环境变量"},{level:2,title:"测试安装是否成功",slug:"测试安装是否成功"},{level:2,title:"conf/settings.xml",slug:"conf-settings-xml"},{level:2,title:"pom",slug:"pom"},{level:2,title:"mvn",slug:"mvn"}]},{title:"Shell之文件操作",frontmatter:{title:"Shell之文件操作",date:"2023-09-23",categories:["DevOps"],tags:["Shell"],sidebar:"auto",publish:!0},regularPath:"/category/devops/shell_files.html",relativePath:"category/devops/shell_files.md",key:"v-7d944daf",path:"/category/devops/shell_files.html"},{title:"Shell学习笔记",frontmatter:{title:"Shell学习笔记",date:"2021-10-24",categories:["DevOps"],tags:["Shell"],sidebar:"auto",publish:!0},regularPath:"/category/devops/shell.html",relativePath:"category/devops/shell.md",key:"v-216f4f6f",path:"/category/devops/shell.html",headers:[{level:2,title:"变量",slug:"变量"},{level:2,title:"数组",slug:"数组"},{level:2,title:"条件结构",slug:"条件结构"},{level:2,title:"循环结构",slug:"循环结构"},{level:2,title:"文件操作",slug:"文件操作"},{level:2,title:"echo",slug:"echo"},{level:2,title:"exit",slug:"exit"}]},{title:"Node.js安装与配置",frontmatter:{title:"Node.js安装与配置",date:"2021-10-09",categories:["DevOps"],tags:["Node.js","npm"],sidebar:"auto",publish:!0},regularPath:"/category/devops/nodejs.html",relativePath:"category/devops/nodejs.md",key:"v-11663be3",path:"/category/devops/nodejs.html"},{title:"Tomcat安装与配置",frontmatter:{title:"Tomcat安装与配置",date:"2021-02-18",categories:["DevOps"],tags:["Tomcat"],publish:!0},regularPath:"/category/devops/tomcat.html",relativePath:"category/devops/tomcat.md",key:"v-6024e91e",path:"/category/devops/tomcat.html",headers:[{level:2,title:"配置404页面",slug:"配置404页面"}]},{title:"Typora",frontmatter:{title:"Typora",date:"2022-01-09",categories:["DevOps"],sidebar:"auto",publish:!0},regularPath:"/category/devops/typora.html",relativePath:"category/devops/typora.md",key:"v-35439c93",path:"/category/devops/typora.html"},{title:"Visual Studio Code 使用技巧",frontmatter:{title:"Visual Studio Code 使用技巧",date:"2021-10-17",categories:["DevOps"],sidebar:"auto",publish:!0},regularPath:"/category/devops/vscode.html",relativePath:"category/devops/vscode.md",key:"v-9843a6b6",path:"/category/devops/vscode.html",headers:[{level:2,title:"修改终端",slug:"修改终端"},{level:2,title:"格式化代码",slug:"格式化代码"},{level:2,title:"生成 HTML 模板",slug:"生成-html-模板"},{level:2,title:"插件",slug:"插件"}]},{title:"SonarQube学习笔记",frontmatter:{title:"SonarQube学习笔记",date:"2022-09-17",categories:["DevOps"],tags:["Sonar","SonarQube"],sidebar:"auto",publish:!0},regularPath:"/category/devops/sonar.html",relativePath:"category/devops/sonar.md",key:"v-5667600f",path:"/category/devops/sonar.html",headers:[{level:2,title:"环境准备",slug:"环境准备"},{level:3,title:"安装SonarQube",slug:"安装sonarqube"},{level:3,title:"安装PostgreSQL",slug:"安装postgresql"},{level:2,title:"SonarScanner for Maven",slug:"sonarscanner-for-maven"},{level:2,title:"Q & A",slug:"q-a"}]},{title:"前端技术栈",frontmatter:{title:"前端技术栈",date:"2021-11-05",categories:["前端开发"],sidebar:"auto",publish:!0},regularPath:"/category/front-end-development/",relativePath:"category/front-end-development/README.md",key:"v-775fb0fc",path:"/category/front-end-development/",headers:[{level:2,title:"Node.js",slug:"node-js"},{level:3,title:"从命令行运行 Node.js 脚本",slug:"从命令行运行-node-js-脚本"},{level:3,title:"读取环境变量",slug:"读取环境变量"},{level:3,title:"从命令行接受参数",slug:"从命令行接受参数"},{level:2,title:"cross-env",slug:"cross-env"},{level:2,title:"nodemon",slug:"nodemon"},{level:2,title:"json-server",slug:"json-server"},{level:2,title:"Koa",slug:"koa"},{level:2,title:"axios",slug:"axios"},{level:2,title:"lodash",slug:"lodash"},{level:2,title:"log4js",slug:"log4js"},{level:2,title:"Vue",slug:"vue"},{level:2,title:"Test Framework",slug:"test-framework"},{level:3,title:"Jest",slug:"jest"},{level:3,title:"mocha",slug:"mocha"},{level:3,title:"nock",slug:"nock"}]},{frontmatter:{},regularPath:"/category/java/",relativePath:"category/java/README.md",key:"v-0407a904",path:"/category/java/"},{title:"前端模块化",frontmatter:{title:"前端模块化",date:"2021-11-05",categories:["前端开发"],sidebar:"auto",publish:!0},regularPath:"/category/front-end-development/modularity.html",relativePath:"category/front-end-development/modularity.md",key:"v-c142182e",path:"/category/front-end-development/modularity.html",headers:[{level:2,title:"CommonJS 模块化规范",slug:"commonjs-模块化规范"},{level:2,title:"ES6 模块化规范",slug:"es6-模块化规范"}]},{title:"CompletableFuture学习笔记",frontmatter:{title:"CompletableFuture学习笔记",date:"2023-10-11",categories:["编程语言"],tags:["Java"],sidebar:"auto",publish:!0},regularPath:"/category/java/CompletableFuture.html",relativePath:"category/java/CompletableFuture.md",key:"v-e8b873a2",path:"/category/java/CompletableFuture.html",headers:[{level:2,title:"开启异步任务",slug:"开启异步任务"},{level:2,title:"异步任务回调",slug:"异步任务回调"},{level:2,title:"异步任务编排",slug:"异步任务编排"},{level:2,title:"异步任务交互",slug:"异步任务交互"},{level:2,title:"异步任务异常处理",slug:"异步任务异常处理"}]},{title:"Windows实用技巧",frontmatter:{title:"Windows实用技巧",date:"2021-12-09",categories:["DevOps"],sidebar:"auto",publish:!0},regularPath:"/category/devops/windows.html",relativePath:"category/devops/windows.md",key:"v-8bb6c1e2",path:"/category/devops/windows.html",headers:[{level:2,title:"查找进程 & 结束进程",slug:"查找进程-结束进程"},{level:2,title:"生成目录树",slug:"生成目录树"}]},{title:"日期及时区",frontmatter:{title:"日期及时区",categories:["编程语言"],tags:["Java"],date:"2024-04-16",publish:!0},regularPath:"/category/java/date.html",relativePath:"category/java/date.md",key:"v-13441367",path:"/category/java/date.html"},{title:"webpack学习笔记",frontmatter:{title:"webpack学习笔记",date:"2021-10-17",categories:["前端开发"],sidebar:"auto",publish:!0},regularPath:"/category/front-end-development/webpack.html",relativePath:"category/front-end-development/webpack.md",key:"v-d8759ade",path:"/category/front-end-development/webpack.html"},{frontmatter:{},regularPath:"/category/java/mybatis/",relativePath:"category/java/mybatis/README.md",key:"v-10aa3aa9",path:"/category/java/mybatis/"},{title:"IO流",frontmatter:{title:"IO流",categories:["编程语言"],tags:["Java"],date:"2021-03-07",publish:!0},regularPath:"/category/java/io.html",relativePath:"category/java/io.md",key:"v-38951577",path:"/category/java/io.html",headers:[{level:2,title:"概念",slug:"概念"},{level:2,title:"分类",slug:"分类"},{level:2,title:"使用",slug:"使用"}]},{title:"java -jar",frontmatter:{title:"java -jar",date:"2023-05-18",categories:["编程语言"],tags:["Java"],sidebar:"auto",publish:!0},regularPath:"/category/java/java-jar.html",relativePath:"category/java/java-jar.md",key:"v-cfee443a",path:"/category/java/java-jar.html",headers:[{level:2,title:"java -jar",slug:"java-jar"},{level:3,title:"Java Options",slug:"java-options"},{level:3,title:"Application args",slug:"application-args"}]},{title:"JVM调优",frontmatter:{title:"JVM调优",date:"2023-05-19",categories:["编程语言"],tags:["Java"],sidebar:"auto",publish:!0},regularPath:"/category/java/jvm-tuning.html",relativePath:"category/java/jvm-tuning.md",key:"v-ba305d7e",path:"/category/java/jvm-tuning.html",headers:[{level:2,title:"JDK Tools",slug:"jdk-tools"},{level:3,title:"jps",slug:"jps"},{level:3,title:"jinfo",slug:"jinfo"},{level:3,title:"jstat",slug:"jstat"},{level:3,title:"jstack",slug:"jstack"},{level:3,title:"jmap",slug:"jmap"},{level:2,title:"Arthas",slug:"arthas"},{level:2,title:"JVM调优",slug:"jvm调优"},{level:2,title:"CPU过高",slug:"cpu过高"},{level:2,title:"OOM定位",slug:"oom定位"}]},{title:"多线程",frontmatter:{title:"多线程",categories:["编程语言"],tags:["Java"],date:"2021-03-04",sidebar:"auto",publish:!0},regularPath:"/category/java/multi-thread.html",relativePath:"category/java/multi-thread.md",key:"v-6c01f487",path:"/category/java/multi-thread.html",headers:[{level:2,title:"1 基本概念与术语",slug:"_1-基本概念与术语"},{level:3,title:"1.1 进程与线程",slug:"_1-1-进程与线程"},{level:3,title:"1.2 并行与并发",slug:"_1-2-并行与并发"},{level:3,title:"1.3 线程调度",slug:"_1-3-线程调度"},{level:3,title:"1.4 可重入锁",slug:"_1-4-可重入锁"},{level:3,title:"1.5 死锁",slug:"_1-5-死锁"},{level:2,title:"2 创建线程的方式",slug:"_2-创建线程的方式"},{level:3,title:"2.1 继承Thread类",slug:"_2-1-继承thread类"},{level:3,title:"2.2 实现Runnable接口",slug:"_2-2-实现runnable接口"},{level:3,title:"2.3 实现Callable接口",slug:"_2-3-实现callable接口"},{level:3,title:"2.4 线程池",slug:"_2-4-线程池"},{level:2,title:"3 线程的生命周期",slug:"_3-线程的生命周期"},{level:2,title:"4 线程的安全问题",slug:"_4-线程的安全问题"},{level:3,title:"4.1 使用volatile",slug:"_4-1-使用volatile"},{level:3,title:"4.2 使用synchronized",slug:"_4-2-使用synchronized"},{level:3,title:"4.3 使用ReentrantLock",slug:"_4-3-使用reentrantlock"},{level:3,title:"4.4 几种方式比较",slug:"_4-4-几种方式比较"},{level:2,title:"5 线程通信的应用",slug:"_5-线程通信的应用"},{level:2,title:"6 扩展知识",slug:"_6-扩展知识"},{level:3,title:"sleep 和 wait 的区别",slug:"sleep-和-wait-的区别"},{level:3,title:"wait、notify、notifyAll",slug:"wait、notify、notifyall"},{level:2,title:"参考资料",slug:"参考资料"}]},{title:"Servlet",frontmatter:{title:"Servlet",categories:["编程语言"],tags:["Java"],date:"2021-02-25",publish:!0},regularPath:"/category/java/servlet.html",relativePath:"category/java/servlet.md",key:"v-5f47816f",path:"/category/java/servlet.html",headers:[{level:2,title:"Servlet 生命周期",slug:"servlet-生命周期"},{level:3,title:"初始化阶段",slug:"初始化阶段"},{level:3,title:"处理客户端请求阶段",slug:"处理客户端请求阶段"},{level:3,title:"终止阶段",slug:"终止阶段"},{level:2,title:"Servlet 工作原理",slug:"servlet-工作原理"},{level:2,title:"Servlet 隐射路径",slug:"servlet-隐射路径"}]},{title:"JDK安装与配置",frontmatter:{title:"JDK安装与配置",date:"2024-06-09",categories:["编程语言"],tags:["Java","JDK"],sidebar:"auto",publish:!0},regularPath:"/category/java/jdk.html",relativePath:"category/java/jdk.md",key:"v-236e4b6f",path:"/category/java/jdk.html",headers:[{level:2,title:"Windows系统安装JDK",slug:"windows系统安装jdk"},{level:2,title:"Linux系统安装JDK",slug:"linux系统安装jdk"},{level:2,title:"同一台电脑配置多版本JDK",slug:"同一台电脑配置多版本jdk"},{level:2,title:"查看系统是否安装JDK",slug:"查看系统是否安装jdk"},{level:2,title:"命令行窗口配置临时JDK",slug:"命令行窗口配置临时jdk"}]},{title:"Java执行流程及JVM内存模型",frontmatter:{title:"Java执行流程及JVM内存模型",date:"2021-03-07",categories:["编程语言"],tags:["Java"],sidebar:"auto",publish:!0},regularPath:"/category/java/jvm.html",relativePath:"category/java/jvm.md",key:"v-405ccd6f",path:"/category/java/jvm.html",headers:[{level:2,title:"Java执行流程",slug:"java执行流程"},{level:3,title:"编译期",slug:"编译期"},{level:3,title:"运行期",slug:"运行期"},{level:2,title:"JVM内存模型",slug:"jvm内存模型"},{level:3,title:"运行时常量池",slug:"运行时常量池"},{level:3,title:"方法区(Method Area)",slug:"方法区-method-area"},{level:3,title:"堆(Heap)",slug:"堆-heap"},{level:3,title:"虚拟机栈(VM Stack)",slug:"虚拟机栈-vm-stack"},{level:3,title:"程序计数器(PC寄存器、Program Counter Register)",slug:"程序计数器-pc寄存器、program-counter-register"},{level:3,title:"本地方法栈(Native Method Stack)",slug:"本地方法栈-native-method-stack"}]},{title:"Mybatis学习笔记",frontmatter:{title:"Mybatis学习笔记",date:"2021-11-26",tags:["Mybatis"],sidebar:"auto",publish:!1},regularPath:"/category/java/mybatis/mybatis.html",relativePath:"category/java/mybatis/mybatis.md",key:"v-6a42fdbc",path:"/category/java/mybatis/mybatis.html"},{title:"Linux学习笔记",frontmatter:{title:"Linux学习笔记",date:"2021-11-17",categories:["操作系统"],tags:["Linux"],sidebar:"auto",publish:!0},regularPath:"/category/linux/command.html",relativePath:"category/linux/command.md",key:"v-ace41292",path:"/category/linux/command.html",headers:[{level:2,title:"系统管理",slug:"系统管理"},{level:3,title:"进程管理",slug:"进程管理"},{level:3,title:"工作管理",slug:"工作管理"},{level:3,title:"定时任务",slug:"定时任务"},{level:2,title:"文件管理",slug:"文件管理"},{level:3,title:"文本分析 - awk",slug:"文本分析-awk"},{level:3,title:"全局替换 - sed",slug:"全局替换-sed"},{level:3,title:"输入输出 - tee",slug:"输入输出-tee"},{level:2,title:"文件传输",slug:"文件传输"},{level:3,title:"scp",slug:"scp"},{level:2,title:"搜索命令 - find, locate, whereis, which",slug:"搜索命令-find-locate-whereis-which"},{level:2,title:"EOF, >, >>, <, <<",slug:"eof"},{level:2,title:"ssh & ssh-keygen",slug:"ssh-ssh-keygen"},{level:2,title:"grep",slug:"grep"},{level:2,title:"实用脚本",slug:"实用脚本"},{level:3,title:"如果文件存在,则删除",slug:"如果文件存在-则删除"},{level:3,title:"如果目录不存在,则创建",slug:"如果目录不存在-则创建"},{level:2,title:"相关链接",slug:"相关链接"}]},{title:"cp/rcp/scp",frontmatter:{title:"cp/rcp/scp",date:"2024-03-03",categories:["操作系统"],tags:["Linux"],sidebar:"auto",publish:!0},regularPath:"/category/linux/cp.html",relativePath:"category/linux/cp.md",key:"v-c26696ae",path:"/category/linux/cp.html",headers:[{level:2,title:"scp 跨机远程拷贝",slug:"scp-跨机远程拷贝"},{level:3,title:"命令格式",slug:"命令格式"},{level:3,title:"命令参数",slug:"命令参数"},{level:3,title:"使用说明",slug:"使用说明"}]},{title:"流式计算",frontmatter:{title:"流式计算",categories:["编程语言"],tags:["Java"],date:"2021-03-07",publish:!0},regularPath:"/category/java/stream.html",relativePath:"category/java/stream.md",key:"v-bd6f557a",path:"/category/java/stream.html",headers:[{level:2,title:"创建流",slug:"创建流"},{level:2,title:"中间操作",slug:"中间操作"},{level:2,title:"终止操作",slug:"终止操作"},{level:2,title:"参考资料",slug:"参考资料"}]},{title:"FTP/TFTP/FTPS/SFTP学习笔记",frontmatter:{title:"FTP/TFTP/FTPS/SFTP学习笔记",date:"2024-03-03",categories:["操作系统"],tags:["Linux"],sidebar:"auto",publish:!0},regularPath:"/category/linux/ftp.html",relativePath:"category/linux/ftp.md",key:"v-65d68009",path:"/category/linux/ftp.html",headers:[{level:2,title:"SFTP",slug:"sftp"},{level:3,title:"在CentOS7安装SFTP服务器",slug:"在centos7安装sftp服务器"}]},{title:"文件管理",frontmatter:{title:"文件管理",date:"2024-06-23",categories:["操作系统"],tags:["Linux"],sidebar:"auto",publish:!0},regularPath:"/category/linux/file-management.html",relativePath:"category/linux/file-management.md",key:"v-74987d65",path:"/category/linux/file-management.html",headers:[{level:2,title:"mkdir 新建文件夹",slug:"mkdir-新建文件夹"},{level:2,title:"cd 切换目录",slug:"cd-切换目录"},{level:2,title:"pwd 显示当前路径",slug:"pwd-显示当前路径"},{level:2,title:"ls 列出文件",slug:"ls-列出文件"},{level:2,title:"find 查找文件",slug:"find-查找文件"},{level:2,title:"touch 新建空文件",slug:"touch-新建空文件"},{level:2,title:"mv 剪贴或重命名文件或文件夹",slug:"mv-剪贴或重命名文件或文件夹"},{level:2,title:"cp 复制文件或文件夹",slug:"cp-复制文件或文件夹"},{level:2,title:"rm 删除文件或文件夹",slug:"rm-删除文件或文件夹"},{level:2,title:"cat 查看文件全部内容",slug:"cat-查看文件全部内容"},{level:2,title:"more 与 less 分屏查看长文件内容",slug:"more-与-less-分屏查看长文件内容"},{level:2,title:"head 与 tail 查看文件指定内容",slug:"head-与-tail-查看文件指定内容"},{level:2,title:"vi 与 vim 编辑文件",slug:"vi-与-vim-编辑文件"}]},{title:"Linux软件安装",frontmatter:{title:"Linux软件安装",date:"2024-06-29",categories:["操作系统"],tags:["Linux"],sidebar:"auto",publish:!0},regularPath:"/category/linux/package-manager.html",relativePath:"category/linux/package-manager.md",key:"v-e7ff6efe",path:"/category/linux/package-manager.html",headers:[{level:2,title:"源码安装",slug:"源码安装"},{level:3,title:"configure",slug:"configure"},{level:2,title:"二进制安装",slug:"二进制安装"},{level:3,title:"rpm",slug:"rpm"},{level:3,title:"yum",slug:"yum"},{level:3,title:"apt",slug:"apt"},{level:2,title:"打包、压缩和解压",slug:"打包、压缩和解压"},{level:3,title:"tar",slug:"tar"},{level:3,title:"zip, unzip",slug:"zip-unzip"},{level:3,title:"gzip, gunzip",slug:"gzip-gunzip"},{level:3,title:"bzip2, bunzip2",slug:"bzip2-bunzip2"}]},{title:"硬链接和软连接",frontmatter:{title:"硬链接和软连接",date:"2024-03-20",categories:["操作系统"],tags:["Linux"],sidebar:"auto",publish:!0},regularPath:"/category/linux/ln.html",relativePath:"category/linux/ln.md",key:"v-7c323989",path:"/category/linux/ln.html",headers:[{level:2,title:"硬链接",slug:"硬链接"},{level:2,title:"软连接",slug:"软连接"},{level:2,title:"硬链接和软链接的区别",slug:"硬链接和软链接的区别"}]},{title:"遍历指定文件夹并执行脚本",frontmatter:{title:"遍历指定文件夹并执行脚本",date:"2024-07-15",categories:["操作系统"],tags:["Linux"],sidebar:"auto",publish:!0},regularPath:"/category/linux/traverse-and-execute-scripts.html",relativePath:"category/linux/traverse-and-execute-scripts.md",key:"v-4cbd3a29",path:"/category/linux/traverse-and-execute-scripts.html"},{frontmatter:{},regularPath:"/category/middleware/",relativePath:"category/middleware/README.md",key:"v-11d8a738",path:"/category/middleware/"},{title:"Shell学习笔记",frontmatter:{title:"Shell学习笔记",date:"2024-07-18",categories:["操作系统"],tags:["Linux"],sidebar:"auto",publish:!0},regularPath:"/category/linux/shell.html",relativePath:"category/linux/shell.md",key:"v-c6899e26",path:"/category/linux/shell.html",headers:[{level:2,title:"Shell 脚本",slug:"shell-脚本"},{level:2,title:"运行 Shell 脚本的两种方法",slug:"运行-shell-脚本的两种方法"},{level:3,title:"作为可执行程序",slug:"作为可执行程序"},{level:3,title:"作为解释器参数",slug:"作为解释器参数"},{level:2,title:"Shell 变量",slug:"shell-变量"},{level:3,title:"字符串变量",slug:"字符串变量"},{level:3,title:"整数变量",slug:"整数变量"},{level:3,title:"数组变量",slug:"数组变量"},{level:3,title:"环境变量",slug:"环境变量"},{level:3,title:"特殊变量",slug:"特殊变量"},{level:2,title:"Shell 基本运算符",slug:"shell-基本运算符"},{level:3,title:"算数运算符",slug:"算数运算符"},{level:3,title:"自增和自减操作符",slug:"自增和自减操作符"},{level:3,title:"关系运算符(数值)",slug:"关系运算符-数值"},{level:3,title:"字符串运算符",slug:"字符串运算符"},{level:3,title:"文件测试运算符",slug:"文件测试运算符"},{level:3,title:"布尔运算符",slug:"布尔运算符"},{level:3,title:"逻辑运算符",slug:"逻辑运算符"},{level:2,title:"Shell test 命令",slug:"shell-test-命令"},{level:2,title:"Shell 括号的用法",slug:"shell-括号的用法"},{level:2,title:"Shell 流程控制",slug:"shell-流程控制"},{level:3,title:"条件结构",slug:"条件结构"},{level:3,title:"循环结构",slug:"循环结构"},{level:2,title:"Shell 函数",slug:"shell-函数"},{level:2,title:"Shell 命令连接",slug:"shell-命令连接"},{level:2,title:"标准输入/输出和重定向",slug:"标准输入-输出和重定向"},{level:2,title:"参考资料",slug:"参考资料"}]},{title:"用户与组管理",frontmatter:{title:"用户与组管理",date:"2024-06-23",categories:["操作系统"],tags:["Linux"],sidebar:"auto",publish:!0},regularPath:"/category/linux/user-and-group.html",relativePath:"category/linux/user-and-group.md",key:"v-6d2742e9",path:"/category/linux/user-and-group.html",headers:[{level:2,title:"用户管理",slug:"用户管理"},{level:3,title:"useradd",slug:"useradd"},{level:3,title:"userdel",slug:"userdel"},{level:3,title:"usermod",slug:"usermod"},{level:3,title:"passwd",slug:"passwd"},{level:2,title:"组管理",slug:"组管理"},{level:3,title:"groupadd",slug:"groupadd"},{level:3,title:"groupdel",slug:"groupdel"},{level:3,title:"groupmod",slug:"groupmod"},{level:2,title:"权限控制",slug:"权限控制"},{level:3,title:"chown",slug:"chown"},{level:3,title:"chmod",slug:"chmod"},{level:3,title:"su/sudo",slug:"su-sudo"},{level:3,title:"login/logout",slug:"login-logout"}]},{title:"ActiveMQ学习笔记",frontmatter:{title:"ActiveMQ学习笔记",date:"2022-08-01",categories:["中间件"],tags:["ActiveMQ"],publish:!0},regularPath:"/category/middleware/activemq.html",relativePath:"category/middleware/activemq.md",key:"v-3d63be0f",path:"/category/middleware/activemq.html"},{title:"Web服务器Apache",frontmatter:{title:"Web服务器Apache",date:"2024-06-29",categories:["中间件"],tags:["Apache"],publish:!0},regularPath:"/category/middleware/apache.html",relativePath:"category/middleware/apache.md",key:"v-ffcfe472",path:"/category/middleware/apache.html",headers:[{level:2,title:"Apache 的 rpm安装与启动",slug:"apache-的-rpm安装与启动"},{level:2,title:"Apache 的 源码安装与启动",slug:"apache-的-源码安装与启动"},{level:3,title:"源码安装Apache时如何确定apr版本",slug:"源码安装apache时如何确定apr版本"},{level:3,title:"源码安装Apache时如何确定apr-util版本",slug:"源码安装apache时如何确定apr-util版本"},{level:3,title:"源码安装Apache时如何确定pcre版本",slug:"源码安装apache时如何确定pcre版本"},{level:3,title:"源码安装与启动Apache",slug:"源码安装与启动apache"},{level:2,title:"Apache 安装后检查",slug:"apache-安装后检查"},{level:2,title:"Apache httpd.conf 配置文件",slug:"apache-httpd-conf-配置文件"},{level:2,title:"虚拟主机",slug:"虚拟主机"},{level:3,title:"基于端口的虚拟主机实现方式",slug:"基于端口的虚拟主机实现方式"},{level:3,title:"基于域名的虚拟主机实现方式",slug:"基于域名的虚拟主机实现方式"},{level:3,title:"基于IP地址的虚拟主机实现方式",slug:"基于ip地址的虚拟主机实现方式"}]},{title:"在Docker下安装RabbitMQ",frontmatter:{title:"在Docker下安装RabbitMQ",date:"2022-08-01",categories:["中间件"],tags:["RabbitMQ"],publish:!0},regularPath:"/category/middleware/docker-rabbitmq.html",relativePath:"category/middleware/docker-rabbitmq.md",key:"v-ffed75a2",path:"/category/middleware/docker-rabbitmq.html",headers:[{level:2,title:"拉取镜像",slug:"拉取镜像"},{level:2,title:"运行镜像",slug:"运行镜像"}]},{title:"SSH学习笔记",frontmatter:{title:"SSH学习笔记",date:"2024-06-29",categories:["操作系统"],tags:["Linux"],sidebar:"auto",publish:!0},regularPath:"/category/linux/ssh.html",relativePath:"category/linux/ssh.md",key:"v-7ab54286",path:"/category/linux/ssh.html",headers:[{level:2,title:"SSH 简介",slug:"ssh-简介"},{level:2,title:"SSH 环境搭建",slug:"ssh-环境搭建"},{level:3,title:"远程登录命令",slug:"远程登录命令"},{level:3,title:"使用密码登录",slug:"使用密码登录"},{level:3,title:"使用公钥登录",slug:"使用公钥登录"},{level:2,title:"SSH 生成密钥对",slug:"ssh-生成密钥对"},{level:2,title:"SFTP 服务器搭建",slug:"sftp-服务器搭建"},{level:3,title:"创建SFTP用户与组",slug:"创建sftp用户与组"},{level:3,title:"配置sshd_config",slug:"配置sshd-config"},{level:3,title:"连通性测试",slug:"连通性测试"}]},{title:"Nginx学习笔记",frontmatter:{title:"Nginx学习笔记",date:"2021-02-18",categories:["中间件"],tags:["Nginx"],publish:!0},regularPath:"/category/middleware/nginx.html",relativePath:"category/middleware/nginx.md",key:"v-0f7abfe2",path:"/category/middleware/nginx.html",headers:[{level:2,title:"配置负载均衡",slug:"配置负载均衡"},{level:2,title:"实现 https 访问",slug:"实现-https-访问"},{level:3,title:"安装 ssl 模块",slug:"安装-ssl-模块"},{level:3,title:"部署 ssl 证书",slug:"部署-ssl-证书"},{level:3,title:"配置 nginx.conf",slug:"配置-nginx-conf"},{level:2,title:"Nginx命令",slug:"nginx命令"}]},{title:"RabbitMQ学习笔记",frontmatter:{title:"RabbitMQ学习笔记",date:"2021-03-22",categories:["中间件"],tags:["RabbitMQ"],publish:!0},regularPath:"/category/middleware/rabbitmq.html",relativePath:"category/middleware/rabbitmq.md",key:"v-5f2c0232",path:"/category/middleware/rabbitmq.html",headers:[{level:2,title:"安装Erlang和RabbitMQ",slug:"安装erlang和rabbitmq"},{level:2,title:"工作原理",slug:"工作原理"},{level:2,title:"消息模型",slug:"消息模型"},{level:3,title:"Hello World(简单模式)",slug:"hello-world-简单模式"},{level:3,title:"Work Queues(工作队列)",slug:"work-queues-工作队列"},{level:3,title:"Publish/Subscribe(发布订阅)",slug:"publish-subscribe-发布订阅"},{level:3,title:"Routing(静态路由)",slug:"routing-静态路由"},{level:3,title:"Topics(动态路由)",slug:"topics-动态路由"},{level:2,title:"应用场景",slug:"应用场景"}]},{title:"Redis学习笔记一",frontmatter:{title:"Redis学习笔记一",date:"2020-12-21",categories:["中间件"],tags:["Redis"],sidebar:"auto",publish:!0},regularPath:"/category/middleware/redis1.html",relativePath:"category/middleware/redis1.md",key:"v-7407ac37",path:"/category/middleware/redis1.html",headers:[{level:2,title:"Redis 安装、启动与停止",slug:"redis-安装、启动与停止"},{level:2,title:"Redis 基本操作",slug:"redis-基本操作"},{level:2,title:"Redis 数据类型",slug:"redis-数据类型"},{level:3,title:"基本数据类型",slug:"基本数据类型"},{level:3,title:"特殊数据类型",slug:"特殊数据类型"},{level:2,title:"Redis 事务操作",slug:"redis-事务操作"},{level:2,title:"Redis 发布订阅",slug:"redis-发布订阅"},{level:2,title:"Redis 配置文件",slug:"redis-配置文件"},{level:2,title:"Redis 持久化",slug:"redis-持久化"},{level:3,title:"RDB(Redis DataBase)",slug:"rdb-redis-database"},{level:3,title:"AOF(Append Only File)",slug:"aof-append-only-file"},{level:2,title:"Redis 主从复制",slug:"redis-主从复制"},{level:2,title:"Redis 集群",slug:"redis-集群"},{level:2,title:"Redis 应用",slug:"redis-应用"},{level:2,title:"Java 操作 Redis",slug:"java-操作-redis"},{level:3,title:"Jedis",slug:"jedis"},{level:3,title:"RedisTemplate",slug:"redistemplate"}]},{title:"Linux入门",frontmatter:{title:"Linux入门",date:"2024-06-23",categories:["操作系统"],tags:["VMware","Linux","centos","ubuntu"],sidebar:"auto",publish:!1},regularPath:"/category/linux/",relativePath:"category/linux/README.md",key:"v-65a04ebc",path:"/category/linux/",headers:[{level:2,title:"VMware",slug:"vmware"},{level:3,title:"VMware安装及配置",slug:"vmware安装及配置"},{level:3,title:"Centos7安装及配置",slug:"centos7安装及配置"},{level:3,title:"Ubuntu18安装及配置",slug:"ubuntu18安装及配置"},{level:2,title:"Linux 常用命令",slug:"linux-常用命令"},{level:3,title:"帮助命令",slug:"帮助命令"},{level:3,title:"IP/主机名/域名",slug:"ip-主机名-域名"},{level:3,title:"防火墙",slug:"防火墙"},{level:3,title:"磁盘管理",slug:"磁盘管理"},{level:2,title:"Linux 配置文件",slug:"linux-配置文件"},{level:3,title:"/etc/hosts",slug:"etc-hosts"},{level:2,title:"Linux 安装目录",slug:"linux-安装目录"}]},{title:"Redis学习笔记二",frontmatter:{title:"Redis学习笔记二",author:"未知",date:"2020-03-30",categories:["中间件"],tags:["Redis"],sidebar:"auto",publish:!0},regularPath:"/category/middleware/redis2.html",relativePath:"category/middleware/redis2.md",key:"v-2c088596",path:"/category/middleware/redis2.html",headers:[{level:2,title:"Redis简介",slug:"redis简介"},{level:3,title:"简单介绍",slug:"简单介绍"},{level:3,title:"redis的安装",slug:"redis的安装"},{level:3,title:"为什么使用NOSQL",slug:"为什么使用nosql"},{level:3,title:"四种NoSQL对比",slug:"四种nosql对比"},{level:3,title:"3V+3高",slug:"_3v-3高"},{level:3,title:"ACID",slug:"acid"},{level:3,title:"CAP",slug:"cap"},{level:3,title:"",slug:"为何cap三者不可兼得"},{level:3,title:"Base",slug:"base"},{level:3,title:"分布式和集群",slug:"分布式和集群"},{level:2,title:"Redis的数据类型",slug:"redis的数据类型"},{level:3,title:"公用命令",slug:"公用命令"},{level:3,title:"key的命名建议",slug:"key的命名建议"},{level:3,title:"String",slug:"string"},{level:3,title:"hash",slug:"hash"},{level:3,title:"list",slug:"list"},{level:3,title:"set",slug:"set"},{level:3,title:"zset",slug:"zset"},{level:2,title:"解析配置文件",slug:"解析配置文件"},{level:2,title:"Redis的持久化",slug:"redis的持久化"},{level:3,title:"RDB",slug:"rdb"},{level:3,title:"AOF",slug:"aof"},{level:3,title:"总结",slug:"总结"},{level:2,title:"Redis的事务",slug:"redis的事务"},{level:3,title:"是什么?",slug:"是什么"},{level:3,title:"能干嘛?",slug:"能干嘛"},{level:3,title:"常用命令",slug:"常用命令"},{level:3,title:"这么玩?",slug:"这么玩"},{level:3,title:"乐观锁和悲观锁",slug:"乐观锁和悲观锁"},{level:3,title:"Watch监控",slug:"watch监控"},{level:3,title:"3阶段",slug:"_3阶段"},{level:3,title:"3特性",slug:"_3特性"},{level:2,title:"Redis的发布订阅(一般不用)",slug:"redis的发布订阅-一般不用"},{level:2,title:"Redis的复制(Master/Slave)",slug:"redis的复制-master-slave"},{level:3,title:"是什么?",slug:"是什么-2"},{level:3,title:"能干嘛?",slug:"能干嘛-2"},{level:3,title:"怎么玩?",slug:"怎么玩"},{level:3,title:"常用的主从方式",slug:"常用的主从方式"},{level:3,title:"复制原理",slug:"复制原理"},{level:3,title:"复制的缺点",slug:"复制的缺点"},{level:3,title:"命令",slug:"命令"},{level:2,title:"Redis集群",slug:"redis集群"},{level:3,title:"什么是Redis集群?",slug:"什么是redis集群"},{level:3,title:"集群搭建",slug:"集群搭建"},{level:3,title:"集群命令",slug:"集群命令"},{level:3,title:"节点",slug:"节点"},{level:3,title:"SLOTS",slug:"slots"},{level:3,title:"Redis Cluster原理",slug:"redis-cluster原理"},{level:3,title:"在集群中录入值(组的概念)",slug:"在集群中录入值-组的概念"}]},{title:"Zookeeper学习笔记",frontmatter:{title:"Zookeeper学习笔记",date:"2021-03-15",categories:["中间件"],tags:["zookeeper"],publish:!0},regularPath:"/category/middleware/zookeeper.html",relativePath:"category/middleware/zookeeper.md",key:"v-22eef1cf",path:"/category/middleware/zookeeper.html",headers:[{level:2,title:"zookeeper 简介",slug:"zookeeper-简介"},{level:2,title:"zookeeper 安装部署",slug:"zookeeper-安装部署"},{level:2,title:"zookeeper 基本操作",slug:"zookeeper-基本操作"},{level:2,title:"参考资料",slug:"参考资料"}]},{title:"Python学习笔记",frontmatter:{title:"Python学习笔记",date:"2024-01-29",categories:["编程语言"],tags:["Python"],sidebar:"auto",publish:!0},regularPath:"/category/python/",relativePath:"category/python/README.md",key:"v-657fc160",path:"/category/python/",headers:[{level:2,title:"在IDEA中配置Python环境",slug:"在idea中配置python环境"},{level:2,title:"pip生成requirement配置文件,快速安装配置环境",slug:"pip生成requirement配置文件-快速安装配置环境"},{level:2,title:"模块的理解",slug:"模块的理解"},{level:2,title:"包的理解",slug:"包的理解"},{level:2,title:"数据类型",slug:"数据类型"},{level:2,title:"下划线的用法",slug:"下划线的用法"}]},{title:"使用@ConfigurationProperties注入属性",frontmatter:{title:"使用@ConfigurationProperties注入属性",date:"2024-06-15",categories:["Spring"],sidebar:"auto",publish:!0},regularPath:"/category/spring/@ConfigurationProperties.html",relativePath:"category/spring/@ConfigurationProperties.md",key:"v-2ea49e47",path:"/category/spring/@ConfigurationProperties.html"},{title:"Python自动化测试学习笔记",frontmatter:{title:"Python自动化测试学习笔记",date:"2024-01-29",categories:["测试框架"],tags:["Python","pytest","selenium","自动化测试"],sidebar:"auto",publish:!0},regularPath:"/category/python/python-automated-testing.html",relativePath:"category/python/python-automated-testing.md",key:"v-473c041a",path:"/category/python/python-automated-testing.html",headers:[{level:2,title:"pytest",slug:"pytest"},{level:3,title:"测试发现约定",slug:"测试发现约定"},{level:3,title:"执行测试用例",slug:"执行测试用例"},{level:2,title:"Web自动化测试",slug:"web自动化测试"},{level:3,title:"安装selenium",slug:"安装selenium"},{level:3,title:"安装webdriver-helper",slug:"安装webdriver-helper"}]},{frontmatter:{},regularPath:"/category/testing-frameworks/",relativePath:"category/testing-frameworks/README.md",key:"v-380e1338",path:"/category/testing-frameworks/"},{title:"Swagger学习笔记",frontmatter:{title:"Swagger学习笔记",date:"2021-11-26",categories:["测试框架"],tags:["接口测试"],sidebar:"auto",publish:!1},regularPath:"/category/testing-frameworks/swagger.html",relativePath:"category/testing-frameworks/swagger.md",key:"v-d87f35e2",path:"/category/testing-frameworks/swagger.html"},{frontmatter:{},regularPath:"/category/wiki/",relativePath:"category/wiki/README.md",key:"v-3ca80b68",path:"/category/wiki/"},{title:"Cucumber学习笔记",frontmatter:{title:"Cucumber学习笔记",date:"2024-08-27",categories:["测试框架"],tags:["自动化测试"],sidebar:"auto",publish:!0},regularPath:"/category/testing-frameworks/cucumber.html",relativePath:"category/testing-frameworks/cucumber.md",key:"v-45a79697",path:"/category/testing-frameworks/cucumber.html",headers:[{level:2,title:"Cucumber",slug:"cucumber"},{level:2,title:"Gherkin",slug:"gherkin"},{level:3,title:"Step Definitions",slug:"step-definitions"},{level:3,title:"Keywords",slug:"keywords"},{level:3,title:"Step Arguments",slug:"step-arguments"},{level:2,title:"Hook",slug:"hook"},{level:2,title:"IDEA cucumber support",slug:"idea-cucumber-support"},{level:3,title:"Enable plugins",slug:"enable-plugins"},{level:3,title:"Add the Cucumber library",slug:"add-the-cucumber-library"},{level:2,title:"Run feature file",slug:"run-feature-file"},{level:3,title:"前置条件",slug:"前置条件"},{level:3,title:"运行指定的feature文件",slug:"运行指定的feature文件"},{level:3,title:"运行指定的feature文件并生成Allure报告",slug:"运行指定的feature文件并生成allure报告"},{level:2,title:"Reference",slug:"reference"}]},{title:"Junit单元测试框架",frontmatter:{title:"Junit单元测试框架",date:"2024-05-11",categories:["测试框架"],tags:["单元测试","JUnit","Mockito","PowerMock","Spring"],sidebar:"auto",publish:!1},regularPath:"/category/testing-frameworks/junit.html",relativePath:"category/testing-frameworks/junit.md",key:"v-b18a22e2",path:"/category/testing-frameworks/junit.html",headers:[{level:2,title:"基本概念",slug:"基本概念"},{level:3,title:"JUnit",slug:"junit"},{level:3,title:"Spring常用注解",slug:"spring常用注解"},{level:2,title:"常见的Mock框架",slug:"常见的mock框架"},{level:3,title:"Mockito",slug:"mockito"},{level:3,title:"PowerMock",slug:"powermock"},{level:2,title:"常用插件",slug:"常用插件"},{level:3,title:"Maven Surefire Plugin",slug:"maven-surefire-plugin"},{level:3,title:"JaCoCo(Java Code Coverage)",slug:"jacoco-java-code-coverage"},{level:2,title:"常见问题",slug:"常见问题"},{level:3,title:"SpringExtension & MockitoExtension",slug:"springextension-mockitoextension"}]},{title:"缓存穿透、缓存击穿、缓存雪崩区别和解决方案",frontmatter:{title:"缓存穿透、缓存击穿、缓存雪崩区别和解决方案",date:"2021-03-21",publish:!0},regularPath:"/category/wiki/cache.html",relativePath:"category/wiki/cache.md",key:"v-7777688f",path:"/category/wiki/cache.html",headers:[{level:2,title:"缓存流程",slug:"缓存流程"},{level:2,title:"缓存穿透",slug:"缓存穿透"},{level:2,title:"缓存击穿",slug:"缓存击穿"},{level:2,title:"缓存雪崩",slug:"缓存雪崩"},{level:2,title:"参考资料",slug:"参考资料"}]},{title:"Allure自动化测试报告学习笔记",frontmatter:{title:"Allure自动化测试报告学习笔记",date:"2024-02-06",categories:["测试框架"],tags:["自动化测试"],sidebar:"auto",publish:!0},regularPath:"/category/testing-frameworks/allure.html",relativePath:"category/testing-frameworks/allure.md",key:"v-c30d6fd6",path:"/category/testing-frameworks/allure.html",headers:[{level:2,title:"Allure",slug:"allure"},{level:3,title:"Allure report installation",slug:"allure-report-installation"},{level:3,title:"How it works",slug:"how-it-works"}]},{title:"FQDN",frontmatter:{title:"FQDN",date:"2024-08-07",categories:["计算机术语"],sidebar:"auto",publish:!0},regularPath:"/category/wiki/fqdn.html",relativePath:"category/wiki/fqdn.md",key:"v-3d0a2735",path:"/category/wiki/fqdn.html",headers:[{level:2,title:"DNS记录类型",slug:"dns记录类型"},{level:3,title:"A记录",slug:"a记录"},{level:3,title:"AAAA记录",slug:"aaaa记录"},{level:3,title:"CNAME记录",slug:"cname记录"},{level:3,title:"NS记录",slug:"ns记录"},{level:3,title:"MX记录",slug:"mx记录"},{level:3,title:"TXT记录",slug:"txt记录"},{level:3,title:"PTR记录",slug:"ptr记录"},{level:3,title:"SOA记录",slug:"soa记录"},{level:3,title:"SRV记录",slug:"srv记录"},{level:3,title:"URL转发",slug:"url转发"}]},{title:"进制转换",frontmatter:{title:"进制转换",date:"2021-03-03",publish:!0},regularPath:"/category/wiki/conversion.html",relativePath:"category/wiki/conversion.md",key:"v-3bd6109a",path:"/category/wiki/conversion.html"},{title:"脏读、不可重复读、幻读和数据库隔离级别",frontmatter:{title:"脏读、不可重复读、幻读和数据库隔离级别",date:"2021-03-02",publish:!0},regularPath:"/category/wiki/isolation.html",relativePath:"category/wiki/isolation.md",key:"v-627f45e2",path:"/category/wiki/isolation.html",headers:[{level:2,title:"脏读",slug:"脏读"},{level:2,title:"不可重复读",slug:"不可重复读"},{level:2,title:"幻读",slug:"幻读"},{level:2,title:"数据库的隔离级别",slug:"数据库的隔离级别"}]},{title:"邮件服务器工作原理",frontmatter:{title:"邮件服务器工作原理",date:"2024-07-31",categories:["Mail server"],sidebar:"auto",publish:!0},regularPath:"/category/wiki/mail-server.html",relativePath:"category/wiki/mail-server.md",key:"v-000728af",path:"/category/wiki/mail-server.html",headers:[{level:2,title:"Mail server与DNS之间的关系",slug:"mail-server与dns之间的关系"},{level:2,title:"邮件传输所需要的组件以及相关协议",slug:"邮件传输所需要的组件以及相关协议"},{level:2,title:"常用的邮件系统框架",slug:"常用的邮件系统框架"},{level:2,title:"安装和配置 Dovecot IMAP 和 POP3 服务器",slug:"安装和配置-dovecot-imap-和-pop3-服务器"},{level:3,title:"安装 Dovecot",slug:"安装-dovecot"},{level:3,title:"配置 Dovecot",slug:"配置-dovecot"},{level:3,title:"参考资料",slug:"参考资料"},{level:2,title:"名词解释",slug:"名词解释"}]},{frontmatter:{},regularPath:"/category/wiki/mail-server-test.html",relativePath:"category/wiki/mail-server-test.md",key:"v-612c185a",path:"/category/wiki/mail-server-test.html",headers:[{level:2,title:"邮箱账号测试",slug:"邮箱账号测试"},{level:2,title:"网络连通性测试",slug:"网络连通性测试"},{level:2,title:"端口连通性测试",slug:"端口连通性测试"},{level:2,title:"DNS解析测试",slug:"dns解析测试"},{level:2,title:"SMTP服务测试",slug:"smtp服务测试"},{level:2,title:"POP3/IMAP服务测试",slug:"pop3-imap服务测试"},{level:2,title:"邮件传输测试",slug:"邮件传输测试"},{level:2,title:"邮件队列监控",slug:"邮件队列监控"}]},{title:"乐观锁与悲观锁",frontmatter:{title:"乐观锁与悲观锁",date:"2021-03-03",publish:!0,sidebar:"auto"},regularPath:"/category/wiki/optimistic-pessimistic-locking.html",relativePath:"category/wiki/optimistic-pessimistic-locking.md",key:"v-ebbc0e96",path:"/category/wiki/optimistic-pessimistic-locking.html"},{title:"查询一个FQDN的所有IP地址",frontmatter:{title:"查询一个FQDN的所有IP地址",date:"2024-08-07",categories:["计算机术语"],sidebar:"auto",publish:!0},regularPath:"/category/wiki/query_fqdn_ips.html",relativePath:"category/wiki/query_fqdn_ips.md",key:"v-b5c38f26",path:"/category/wiki/query_fqdn_ips.html",headers:[{level:2,title:"使用Python查询一个FQDN的所有IP地址",slug:"使用python查询一个fqdn的所有ip地址"}]},{title:"SMTP/POP3/IMAP",frontmatter:{title:"SMTP/POP3/IMAP",date:"2024-07-04",categories:["操作系统"],tags:["Linux"],sidebar:"auto",publish:!0},regularPath:"/category/wiki/smtp-pop3-imap.html",relativePath:"category/wiki/smtp-pop3-imap.md",key:"v-4f836b11",path:"/category/wiki/smtp-pop3-imap.html"},{frontmatter:{layout:"Tags",title:"Tags"},regularPath:"/tag/",key:"v-b1564aac",path:"/tag/"},{frontmatter:{layout:"FrontmatterKey",title:"Categories"},regularPath:"/categories/",key:"v-ef9325c4",path:"/categories/"},{frontmatter:{layout:"TimeLines",title:"Timeline"},regularPath:"/timeline/",key:"v-6319eb4e",path:"/timeline/"},{frontmatter:{layout:"Tag",title:"树 Tags"},regularPath:"/tag/%E6%A0%91/",key:"v-73e170ba",path:"/tag/树/"},{frontmatter:{layout:"Tag",title:"Oracle Tags"},regularPath:"/tag/Oracle/",key:"v-0903fc67",path:"/tag/Oracle/"},{frontmatter:{layout:"Tag",title:"PostgreSQL Tags"},regularPath:"/tag/PostgreSQL/",key:"v-60254b1e",path:"/tag/PostgreSQL/"},{frontmatter:{layout:"Tag",title:"MySQL Tags"},regularPath:"/tag/MySQL/",key:"v-dc3c2992",path:"/tag/MySQL/"},{frontmatter:{layout:"Tag",title:"H2 Tags"},regularPath:"/tag/H2/",key:"v-e8d97cca",path:"/tag/H2/"},{frontmatter:{layout:"Tag",title:"Ansible Tags"},regularPath:"/tag/Ansible/",key:"v-96cce67e",path:"/tag/Ansible/"},{frontmatter:{layout:"Tag",title:"Docker Tags"},regularPath:"/tag/Docker/",key:"v-83bebff6",path:"/tag/Docker/"},{frontmatter:{layout:"Tag",title:"SQL Tags"},regularPath:"/tag/SQL/",key:"v-324b2c2a",path:"/tag/SQL/"},{frontmatter:{layout:"Tag",title:"ShardingSphere Tags"},regularPath:"/tag/ShardingSphere/",key:"v-7dca53d8",path:"/tag/ShardingSphere/"},{frontmatter:{layout:"Tag",title:"BAT Tags"},regularPath:"/tag/BAT/",key:"v-325b16f8",path:"/tag/BAT/"},{frontmatter:{layout:"Tag",title:"Shell Tags"},regularPath:"/tag/Shell/",key:"v-c98ff16e",path:"/tag/Shell/"},{frontmatter:{layout:"Tag",title:"Nginx Tags"},regularPath:"/tag/Nginx/",key:"v-dab8e1c2",path:"/tag/Nginx/"},{frontmatter:{layout:"Tag",title:"Redis Tags"},regularPath:"/tag/Redis/",key:"v-cd4f2d44",path:"/tag/Redis/"},{frontmatter:{layout:"Tag",title:"ElasticSearch Tags"},regularPath:"/tag/ElasticSearch/",key:"v-c8d3ff88",path:"/tag/ElasticSearch/"},{frontmatter:{layout:"Tag",title:"FastDFS Tags"},regularPath:"/tag/FastDFS/",key:"v-0cdb3964",path:"/tag/FastDFS/"},{frontmatter:{layout:"Tag",title:"Naco Tags"},regularPath:"/tag/Naco/",key:"v-1797fbb4",path:"/tag/Naco/"},{frontmatter:{layout:"Tag",title:"GitLab Tags"},regularPath:"/tag/GitLab/",key:"v-5377a52a",path:"/tag/GitLab/"},{frontmatter:{layout:"Tag",title:"Git Tags"},regularPath:"/tag/Git/",key:"v-32555732",path:"/tag/Git/"},{frontmatter:{layout:"Tag",title:"Gradle Tags"},regularPath:"/tag/Gradle/",key:"v-61d296be",path:"/tag/Gradle/"},{frontmatter:{layout:"Tag",title:"IDEA Tags"},regularPath:"/tag/IDEA/",key:"v-184030a4",path:"/tag/IDEA/"},{frontmatter:{layout:"Tag",title:"Java Tags"},regularPath:"/tag/Java/",key:"v-18082c7a",path:"/tag/Java/"},{frontmatter:{layout:"Tag",title:"Jenkins Tags"},regularPath:"/tag/Jenkins/",key:"v-77033703",path:"/tag/Jenkins/"},{frontmatter:{layout:"Tag",title:"Maven Tags"},regularPath:"/tag/Maven/",key:"v-dec02164",path:"/tag/Maven/"},{frontmatter:{layout:"Tag",title:"K8S Tags"},regularPath:"/tag/K8S/",key:"v-32532c1a",path:"/tag/K8S/"},{frontmatter:{layout:"Tag",title:"Linux Tags"},regularPath:"/tag/Linux/",key:"v-e14f25f6",path:"/tag/Linux/"},{frontmatter:{layout:"Tag",title:"Tomcat Tags"},regularPath:"/tag/Tomcat/",key:"v-0d0d8d61",path:"/tag/Tomcat/"},{frontmatter:{layout:"Tag",title:"Node.js Tags"},regularPath:"/tag/Node.js/",key:"v-160656e4",path:"/tag/Node.js/"},{frontmatter:{layout:"Tag",title:"npm Tags"},regularPath:"/tag/npm/",key:"v-3231af64",path:"/tag/npm/"},{frontmatter:{layout:"Tag",title:"Sonar Tags"},regularPath:"/tag/Sonar/",key:"v-c8c2cad4",path:"/tag/Sonar/"},{frontmatter:{layout:"Tag",title:"SonarQube Tags"},regularPath:"/tag/SonarQube/",key:"v-21192a6f",path:"/tag/SonarQube/"},{frontmatter:{layout:"Tag",title:"JDK Tags"},regularPath:"/tag/JDK/",key:"v-3253bcb0",path:"/tag/JDK/"},{frontmatter:{layout:"Tag",title:"Mybatis Tags"},regularPath:"/tag/Mybatis/",key:"v-88bd8cf4",path:"/tag/Mybatis/"},{frontmatter:{layout:"Tag",title:"ActiveMQ Tags"},regularPath:"/tag/ActiveMQ/",key:"v-c430aa8a",path:"/tag/ActiveMQ/"},{frontmatter:{layout:"Tag",title:"Apache Tags"},regularPath:"/tag/Apache/",key:"v-2102fe97",path:"/tag/Apache/"},{frontmatter:{layout:"Tag",title:"RabbitMQ Tags"},regularPath:"/tag/RabbitMQ/",key:"v-3c438db2",path:"/tag/RabbitMQ/"},{frontmatter:{layout:"Tag",title:"VMware Tags"},regularPath:"/tag/VMware/",key:"v-3d617f11",path:"/tag/VMware/"},{frontmatter:{layout:"Tag",title:"centos Tags"},regularPath:"/tag/centos/",key:"v-15909639",path:"/tag/centos/"},{frontmatter:{layout:"Tag",title:"ubuntu Tags"},regularPath:"/tag/ubuntu/",key:"v-6dfb9784",path:"/tag/ubuntu/"},{frontmatter:{layout:"Tag",title:"zookeeper Tags"},regularPath:"/tag/zookeeper/",key:"v-87dcfee6",path:"/tag/zookeeper/"},{frontmatter:{layout:"Tag",title:"Python Tags"},regularPath:"/tag/Python/",key:"v-4aea34c9",path:"/tag/Python/"},{frontmatter:{layout:"Tag",title:"pytest Tags"},regularPath:"/tag/pytest/",key:"v-309f60ec",path:"/tag/pytest/"},{frontmatter:{layout:"Tag",title:"selenium Tags"},regularPath:"/tag/selenium/",key:"v-96d7b5b2",path:"/tag/selenium/"},{frontmatter:{layout:"Tag",title:"自动化测试 Tags"},regularPath:"/tag/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/",key:"v-527ac77a",path:"/tag/自动化测试/"},{frontmatter:{layout:"Tag",title:"接口测试 Tags"},regularPath:"/tag/%E6%8E%A5%E5%8F%A3%E6%B5%8B%E8%AF%95/",key:"v-cdc56e72",path:"/tag/接口测试/"},{frontmatter:{layout:"Tag",title:"单元测试 Tags"},regularPath:"/tag/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/",key:"v-46031d55",path:"/tag/单元测试/"},{frontmatter:{layout:"Tag",title:"JUnit Tags"},regularPath:"/tag/JUnit/",key:"v-ea568faa",path:"/tag/JUnit/"},{frontmatter:{layout:"Tag",title:"Mockito Tags"},regularPath:"/tag/Mockito/",key:"v-a6405542",path:"/tag/Mockito/"},{frontmatter:{layout:"Tag",title:"PowerMock Tags"},regularPath:"/tag/PowerMock/",key:"v-82f577ac",path:"/tag/PowerMock/"},{frontmatter:{layout:"Tag",title:"Spring Tags"},regularPath:"/tag/Spring/",key:"v-4bb4ec90",path:"/tag/Spring/"},{frontmatter:{layout:"Category",title:"数据结构 Categories"},regularPath:"/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/",key:"v-95b1bb54",path:"/categories/数据结构/"},{frontmatter:{layout:"Category",title:"数据库 Categories"},regularPath:"/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/",key:"v-572671c3",path:"/categories/数据库/"},{frontmatter:{layout:"Category",title:"DevOps Categories"},regularPath:"/categories/DevOps/",key:"v-88a44b18",path:"/categories/DevOps/"},{frontmatter:{layout:"Category",title:"编程语言 Categories"},regularPath:"/categories/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/",key:"v-b7ee3692",path:"/categories/编程语言/"},{frontmatter:{layout:"Category",title:"前端开发 Categories"},regularPath:"/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/",key:"v-667f2e23",path:"/categories/前端开发/"},{frontmatter:{layout:"Category",title:"操作系统 Categories"},regularPath:"/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/",key:"v-9b5f3d42",path:"/categories/操作系统/"},{frontmatter:{layout:"Category",title:"中间件 Categories"},regularPath:"/categories/%E4%B8%AD%E9%97%B4%E4%BB%B6/",key:"v-ab31fcde",path:"/categories/中间件/"},{frontmatter:{layout:"Category",title:"Spring Categories"},regularPath:"/categories/Spring/",key:"v-3077e678",path:"/categories/Spring/"},{frontmatter:{layout:"Category",title:"测试框架 Categories"},regularPath:"/categories/%E6%B5%8B%E8%AF%95%E6%A1%86%E6%9E%B6/",key:"v-b6d05696",path:"/categories/测试框架/"},{frontmatter:{layout:"Category",title:"计算机术语 Categories"},regularPath:"/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%9C%AF%E8%AF%AD/",key:"v-22a7942c",path:"/categories/计算机术语/"},{frontmatter:{layout:"Category",title:"Mail server Categories"},regularPath:"/categories/Mail%20server/",key:"v-61d4a47e",path:"/categories/Mail server/"},{frontmatter:{layout:"Layout",title:"Page 2 - Java | Tags"},regularPath:"/tag/Java/page/2/",key:"v-e3c98acc",path:"/tag/Java/page/2/"},{frontmatter:{layout:"Layout",title:"Page 2 - Linux | Tags"},regularPath:"/tag/Linux/page/2/",key:"v-957a2dd0",path:"/tag/Linux/page/2/"},{frontmatter:{layout:"Layout",title:"Page 2 - DevOps | Categories"},regularPath:"/categories/DevOps/page/2/",key:"v-4be95e6e",path:"/categories/DevOps/page/2/"},{frontmatter:{layout:"Layout",title:"Page 3 - DevOps | Categories"},regularPath:"/categories/DevOps/page/3/",key:"v-4be95e30",path:"/categories/DevOps/page/3/"},{frontmatter:{layout:"Layout",title:"Page 2 - 编程语言 | Categories"},regularPath:"/categories/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/page/2/",key:"v-3e0075b4",path:"/categories/编程语言/page/2/"},{frontmatter:{layout:"Layout",title:"Page 2 - 操作系统 | Categories"},regularPath:"/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/page/2/",key:"v-7b4b8904",path:"/categories/操作系统/page/2/"}],themeConfig:{type:"blog",nav:[{text:"首页",link:"/",icon:"reco-home"},{text:"时间轴",link:"/timeline/",icon:"reco-date"}],blogConfig:{category:{location:2,text:"分类"},tag:{location:3,text:"标签"},socialLinks:[{icon:"reco-github",link:"https://github.com/maiaimei"},{icon:"reco-mayun",link:"https://gitee.com/maiaimei"}]},sidebar:{"/category":[{title:"我的笔记",collapsable:!1,sidebarDepth:3,children:[{title:"Java",collapsable:!0,sidebarDepth:2,path:"/category/java",children:["/category/java/CompletableFuture.md","/category/java/date.md","/category/java/io.md","/category/java/java-jar.md","/category/java/jdk.md","/category/java/jvm-tuning.md","/category/java/jvm.md","/category/java/multi-thread.md",{title:"mybatis",collapsable:!0,sidebarDepth:2,path:"/category/java/mybatis",children:["/category/java/mybatis/mybatis.md"]},"/category/java/servlet.md","/category/java/stream.md"]},{title:"Python",collapsable:!0,sidebarDepth:2,path:"/category/python",children:["/category/python/python-automated-testing.md"]},{title:"Spring",collapsable:!0,sidebarDepth:2,path:"/category/spring/@ConfigurationProperties",children:["/category/spring/@ConfigurationProperties.md"]},{title:"Linux",collapsable:!0,sidebarDepth:2,path:"/category/linux",children:["/category/linux/command.md","/category/linux/cp.md","/category/linux/file-management.md","/category/linux/ftp.md","/category/linux/ln.md","/category/linux/package-manager.md","/category/linux/shell.md","/category/linux/ssh.md","/category/linux/traverse-and-execute-scripts.md","/category/linux/user-and-group.md"]},{title:"DevOps",collapsable:!0,sidebarDepth:2,path:"/category/devops",children:["/category/devops/aliyun_docker_nginx.md","/category/devops/ansible.md","/category/devops/atguigu_docker.md","/category/devops/atguigu_ShardingSphere5.md","/category/devops/bat_shell.md","/category/devops/docker.md","/category/devops/docker_redis.md","/category/devops/git.md","/category/devops/gitlab.md","/category/devops/gradle.md","/category/devops/idea.md","/category/devops/jdk_source_compile.md","/category/devops/jenkins.md","/category/devops/k8s.md","/category/devops/linux_deploy_webapp.md","/category/devops/maven-surefire-plugin.md","/category/devops/maven.md","/category/devops/nodejs.md","/category/devops/shell.md","/category/devops/shell_files.md","/category/devops/sonar.md","/category/devops/tomcat.md","/category/devops/typora.md","/category/devops/vscode.md","/category/devops/windows.md"]},{title:"中间件",collapsable:!0,sidebarDepth:2,path:"/category/middleware",children:["/category/middleware/activemq.md","/category/middleware/apache.md","/category/middleware/docker-rabbitmq.md","/category/middleware/nginx.md","/category/middleware/rabbitmq.md","/category/middleware/redis1.md","/category/middleware/redis2.md","/category/middleware/zookeeper.md"]},{title:"数据库",collapsable:!0,sidebarDepth:2,path:"/category/database",children:["/category/database/mysql.md","/category/database/oracle.md","/category/database/postgresql.md","/category/database/sql.md"]},{title:"数据结构",collapsable:!0,sidebarDepth:2,path:"/category/data-structure",children:["/category/data-structure/tree.md"]},{title:"测试框架",collapsable:!0,sidebarDepth:2,path:"/category/testing-frameworks",children:["/category/testing-frameworks/allure.md","/category/testing-frameworks/cucumber.md","/category/testing-frameworks/junit.md","/category/testing-frameworks/swagger.md"]},{title:"前端开发",collapsable:!0,sidebarDepth:2,path:"/category/front-end-development",children:["/category/front-end-development/modularity.md","/category/front-end-development/webpack.md"]},{title:"知识中心",collapsable:!0,sidebarDepth:2,path:"/category/wiki",children:["/category/wiki/cache.md","/category/wiki/conversion.md","/category/wiki/fqdn.md","/category/wiki/isolation.md","/category/wiki/mail-server-test.md","/category/wiki/mail-server.md","/category/wiki/optimistic-pessimistic-locking.md","/category/wiki/query_fqdn_ips.md","/category/wiki/smtp-pop3-imap.md"]}]}]},subSidebar:"auto",displayAllHeaders:!0,logo:"/logo.jpg",search:!0,searchMaxSuggestions:10,author:"maiaimei",authorAvatar:"/avatar.jpg",record:"粤ICP备2021019182号-1",recordLink:"https://beian.miit.gov.cn/",startYear:"2021"},locales:{"/":{lang:"zh-CN",path:"/"}}},en=(n(57),n(241),n(242),n(72),n(243),n(70)),tn={computed:{$recoPosts:function(){var e=this.$site.pages;return e=Object(en.a)(e,!1),Object(en.c)(e),e},$recoPostsForTimeline:function(){var e=this.$recoPosts,t={},n=[];e=Object(en.a)(e,!0),this.pages=0==e.length?[]:e;for(var r=0,o=e.length;r-1)&&([o,a].indexOf("auto")>-1&&i.length>0||[t,n].indexOf("auto")>-1&&i.length>0)}}};function nn(e,t){e=function(e){var t=new Date(e).toJSON();return new Date(+new Date(t)+288e5).toISOString().replace(/T/g," ").replace(/\.[\d]{3}Z/,"").replace(/-/g,"/")}(e);var n=new Date(e),r=n.getFullYear(),o=n.getMonth()+1,a=n.getDate();return"year"==t?r:"".concat(o,"-").concat(a)}var rn={all:"全部",article:"文章",tag:"标签",category:"分类",friendLink:"友情链接",timeLine:"时间轴",timeLineMsg:"昨日重现!"},on={all:"全部",article:"文章",tag:"標簽",category:"分類",friendLink:"友情鏈接",timeLine:"時間軸",timeLineMsg:"昨日重現!"},an={all:"All",article:"Articles",tag:"Tags",category:"Categories",friendLink:"Friend Links",timeLine:"TimeLine",timeLineMsg:"Yesterday Once More!"},sn={all:"全部",article:"文章",tag:"ラベル",category:"分類",friendLink:"友情リンク",timeLine:"タイムライン",timeLineMsg:"昨日また!"},ln={all:"전체",article:"글",tag:"태그",category:"분류",friendLink:"링크 참조",timeLine:"타임 라인",timeLineMsg:"어제 또!"},cn={all:"Todas",article:"Artículos",tag:"Etiquetas",category:"Categorías",friendLink:"Páginas amigas",timeLine:"Cronología",timeLineMsg:"¡Ayer otra vez!"},un={computed:{$recoLocales:function(){var e=this.$themeLocaleConfig.recoLocales||{};return/^zh\-(CN|SG)$/.test(this.$lang)?Object(Ht.a)(Object(Ht.a)({},rn),e):/^zh\-(HK|MO|TW)$/.test(this.$lang)?Object(Ht.a)(Object(Ht.a)({},on),e):/^ja\-JP$/.test(this.$lang)?Object(Ht.a)(Object(Ht.a)({},sn),e):/^ko\-KR$/.test(this.$lang)?Object(Ht.a)(Object(Ht.a)({},ln),e):/^es(\-[A-Z]+)?$/.test(this.$lang)?Object(Ht.a)(Object(Ht.a)({},cn),e):Object(Ht.a)(Object(Ht.a)({},an),e)}}},pn=n(27),fn=n(73),dn=n(136);n(386);a.default.component("Badge",(function(){return Promise.all([n.e(0),n.e(33)]).then(n.bind(null,765))}));n(387);var hn={name:"BackToTop",data:function(){return{visible:!1,customStyle:{right:"1rem",bottom:"6rem",width:"2.5rem",height:"2.5rem","border-radius":".25rem","line-height":"2.5rem"},visibilityHeight:400}},mounted:function(){window.addEventListener("scroll",this.throttle(this.handleScroll,500))},beforeDestroy:function(){window.removeEventListener("scroll",this.throttle(this.handleScroll,500))},methods:{handleScroll:function(){this.visible=window.pageYOffset>this.visibilityHeight},backToTop:function(){window.scrollTo(0,0)},throttle:function(e,t){var n=null,r=Date.now();return function(){var o=Date.now(),a=t-(o-r),i=this,s=arguments;clearTimeout(n),a<=0?(e.apply(i,s),r=Date.now()):n=setTimeout(e,a)}}}},vn=(n(388),Object(Wt.a)(hn,(function(){var e=this.$createElement,t=this._self._c||e;return t("transition",{attrs:{name:"fade"}},[t("div",{directives:[{name:"show",rawName:"v-show",value:this.visible,expression:"visible"}],staticClass:"back-to-ceiling",style:this.customStyle,on:{click:this.backToTop}},[t("svg",{staticClass:"icon",attrs:{t:"1574745035067",viewBox:"0 0 1024 1024",version:"1.1",xmlns:"http://www.w3.org/2000/svg","p-id":"5404"}},[t("path",{attrs:{d:"M526.60727968 10.90185116a27.675 27.675 0 0 0-29.21455937 0c-131.36607665 82.28402758-218.69155461 228.01873535-218.69155402 394.07834331a462.20625001 462.20625001 0 0 0 5.36959153 69.94390903c1.00431239 6.55289093-0.34802892 13.13561351-3.76865779 18.80351572-32.63518765 54.11355614-51.75690182 118.55860487-51.7569018 187.94566865a371.06718723 371.06718723 0 0 0 11.50484808 91.98906777c6.53300375 25.50556257 41.68394495 28.14064038 52.69160883 4.22606766 17.37162448-37.73630017 42.14135425-72.50938081 72.80769204-103.21549295 2.18761121 3.04276886 4.15646224 6.24463696 6.40373557 9.22774369a1871.4375 1871.4375 0 0 0 140.04691725 5.34970492 1866.36093723 1866.36093723 0 0 0 140.04691723-5.34970492c2.24727335-2.98310674 4.21612437-6.18497483 6.3937923-9.2178004 30.66633723 30.70611158 55.4360664 65.4791928 72.80769147 103.21549355 11.00766384 23.91457269 46.15860503 21.27949489 52.69160879-4.22606768a371.15156223 371.15156223 0 0 0 11.514792-91.99901164c0-69.36717486-19.13165746-133.82216804-51.75690182-187.92578088-3.42062944-5.66790279-4.76302748-12.26056868-3.76865837-18.80351632a462.20625001 462.20625001 0 0 0 5.36959269-69.943909c-0.00994388-166.08943902-87.32547796-311.81420293-218.6915546-394.09823051zM605.93803103 357.87693858a93.93749974 93.93749974 0 1 1-187.89594924 6.1e-7 93.93749974 93.93749974 0 0 1 187.89594924-6.1e-7z","p-id":"5405"}}),t("path",{attrs:{d:"M429.50777625 765.63860547C429.50777625 803.39355007 466.44236686 1000.39046097 512.00932183 1000.39046097c45.56695499 0 82.4922232-197.00623328 82.5015456-234.7518555 0-37.75494459-36.9345906-68.35043303-82.4922232-68.34111062-45.57627738-0.00932239-82.52019037 30.59548842-82.51086798 68.34111062z","p-id":"5406"}})])])])}),[],!1,null,"c6073ba8",null).exports),gn=(n(389),Object(Wt.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"loader-wrapper"}},[n("div",{staticClass:"loader-main"},e._l(4,(function(e){return n("div",{key:"out"+e})})),0),e._v(" "),e.$frontmatter.home?n("h3",{staticClass:"title"},[e._v(e._s(e.$site.title||e.$localeConfig.title))]):e._e(),e._v(" "),e.$frontmatter.home?n("p",{staticClass:"description"},[e._v(e._s(e.$site.description||e.$localeConfig.description))]):e._e()])}),[],!1,null,"d48f4d20",null).exports),mn=(n(390),{prev:"上一页",next:"下一页",go:"前往",jump:"跳转至"}),yn={prev:"上壹頁",next:"下壹頁",go:"前往",jump:"跳轉至"},bn={prev:"Prev",next:"Next",go:"Go",jump:"Jump To"},wn={prev:"前のページ",next:"次のページ",go:"へ",jump:"ジャンプ"},xn={prev:"이전 페이지",next:"다음 페이지",go:"행",jump:"건너뛰기"};var _n={data:function(){return{changePage:"",pageSize:10}},props:{total:{type:Number,default:10},perPage:{type:Number,default:10},currentPage:{type:Number,default:1}},computed:{pages:function(){var e=this.pageSize||this.perPage;return Math.ceil(this.total/e)},show:function(){return this.pages&&1!=this.pages},efont:function(){return!(this.pages<=7)&&this.currentPage>5},indexs:function(){var e=1,t=this.pages,n=[];for(this.pages>=7&&(this.currentPage>5&&this.currentPage1&&this.emit(--e)},goNext:function(){var e=this.currentPage;e0?this.emit(t):alert("请输入大于0,并且小于".concat(this.pages,"的页码!"))},emit:function(e){this.$emit("getCurrentPage",e)}}},kn=(n(392),Object(Wt.a)(_n,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{directives:[{name:"show",rawName:"v-show",value:e.show,expression:"show"}],staticClass:"pagation"},[n("div",{staticClass:"pagation-list"},[n("span",{directives:[{name:"show",rawName:"v-show",value:e.currentPage>1,expression:"currentPage > 1"}],staticClass:"jump",attrs:{unselectable:"on"},on:{click:e.goPrev}},[e._v(e._s(e.pagationLocales.prev))]),e._v(" "),n("span",{directives:[{name:"show",rawName:"v-show",value:e.efont,expression:"efont"}],staticClass:"jump",on:{click:function(t){return e.jumpPage(1)}}},[e._v("1")]),e._v(" "),n("span",{directives:[{name:"show",rawName:"v-show",value:e.efont,expression:"efont"}],staticClass:"ellipsis"},[e._v("...")]),e._v(" "),e._l(e.indexs,(function(t){return n("span",{key:t,staticClass:"jump",class:{bgprimary:e.currentPage==t},on:{click:function(n){return e.jumpPage(t)}}},[e._v(e._s(t))])})),e._v(" "),n("span",{directives:[{name:"show",rawName:"v-show",value:e.efont&&e.currentPageObject(Rn.stringify)(e),Nn=(e,t)=>`${e}${Object(Rn.stringify)(t,{addQueryPrefix:!0})}`,Fn=(e,t)=>`${e.replace(/\/$/,"")}/${t.replace(/^\//,"")}`;var zn=n(237),Un=n.n(zn);const Bn=e=>Un()(e,"YYYY-MM-DD HH:mm:ss"),qn=e=>(e.split("#")[0]||"").split("?")[0]||"",Vn=e=>Object(Rn.parse)(e,{ignoreQueryPrefix:!0}) +/*! + * vue-i18n v8.26.5 + * (c) 2021 kazuya kawaguchi + * Released under the MIT License. + */;var Hn=["compactDisplay","currency","currencyDisplay","currencySign","localeMatcher","notation","numberingSystem","signDisplay","style","unit","unitDisplay","useGrouping","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits"];function Qn(e,t){"undefined"!=typeof console&&(console.warn("[vue-i18n] "+e),t&&console.warn(t.stack))}var Wn=Array.isArray;function Jn(e){return null!==e&&"object"==typeof e}function Kn(e){return"string"==typeof e}var Gn=Object.prototype.toString;function Yn(e){return"[object Object]"===Gn.call(e)}function Xn(e){return null==e}function Zn(e){return"function"==typeof e}function er(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=null,r=null;return 1===e.length?Jn(e[0])||Wn(e[0])?r=e[0]:"string"==typeof e[0]&&(n=e[0]):2===e.length&&("string"==typeof e[0]&&(n=e[0]),(Jn(e[1])||Wn(e[1]))&&(r=e[1])),{locale:n,params:r}}function tr(e){return JSON.parse(JSON.stringify(e))}function nr(e,t){return!!~e.indexOf(t)}var rr=Object.prototype.hasOwnProperty;function or(e,t){return rr.call(e,t)}function ar(e){for(var t=arguments,n=Object(e),r=1;r/g,">").replace(/"/g,""").replace(/'/g,"'"))})),e}var lr={name:"i18n",functional:!0,props:{tag:{type:[String,Boolean,Object],default:"span"},path:{type:String,required:!0},locale:{type:String},places:{type:[Array,Object]}},render:function(e,t){var n=t.data,r=t.parent,o=t.props,a=t.slots,i=r.$i18n;if(i){var s=o.path,l=o.locale,c=o.places,u=a(),p=i.i(s,l,function(e){var t;for(t in e)if("default"!==t)return!1;return Boolean(t)}(u)||c?function(e,t){var n=t?function(e){0;return Array.isArray(e)?e.reduce(ur,{}):Object.assign({},e)}(t):{};if(!e)return n;var r=(e=e.filter((function(e){return e.tag||""!==e.text.trim()}))).every(pr);0;return e.reduce(r?cr:ur,n)}(u.default,c):u),f=o.tag&&!0!==o.tag||!1===o.tag?o.tag:"span";return f?e(f,n,p):p}}};function cr(e,t){return t.data&&t.data.attrs&&t.data.attrs.place&&(e[t.data.attrs.place]=t),e}function ur(e,t,n){return e[n]=t,e}function pr(e){return Boolean(e.data&&e.data.attrs&&e.data.attrs.place)}var fr,dr={name:"i18n-n",functional:!0,props:{tag:{type:[String,Boolean,Object],default:"span"},value:{type:Number,required:!0},format:{type:[String,Object]},locale:{type:String}},render:function(e,t){var n=t.props,r=t.parent,o=t.data,a=r.$i18n;if(!a)return null;var i=null,s=null;Kn(n.format)?i=n.format:Jn(n.format)&&(n.format.key&&(i=n.format.key),s=Object.keys(n.format).reduce((function(e,t){var r;return nr(Hn,t)?Object.assign({},e,((r={})[t]=n.format[t],r)):e}),null));var l=n.locale||a.locale,c=a._ntp(n.value,l,i,s),u=c.map((function(e,t){var n,r=o.scopedSlots&&o.scopedSlots[e.type];return r?r(((n={})[e.type]=e.value,n.index=t,n.parts=c,n)):e.value})),p=n.tag&&!0!==n.tag||!1===n.tag?n.tag:"span";return p?e(p,{attrs:o.attrs,class:o.class,staticClass:o.staticClass},u):u}};function hr(e,t,n){mr(e,n)&&yr(e,t,n)}function vr(e,t,n,r){if(mr(e,n)){var o=n.context.$i18n;(function(e,t){var n=t.context;return e._locale===n.$i18n.locale})(e,n)&&ir(t.value,t.oldValue)&&ir(e._localeMessage,o.getLocaleMessage(o.locale))||yr(e,t,n)}}function gr(e,t,n,r){if(n.context){var o=n.context.$i18n||{};t.modifiers.preserve||o.preserveDirectiveContent||(e.textContent=""),e._vt=void 0,delete e._vt,e._locale=void 0,delete e._locale,e._localeMessage=void 0,delete e._localeMessage}else Qn("Vue instance does not exists in VNode context")}function mr(e,t){var n=t.context;return n?!!n.$i18n||(Qn("VueI18n instance does not exists in Vue instance"),!1):(Qn("Vue instance does not exists in VNode context"),!1)}function yr(e,t,n){var r,o,a=function(e){var t,n,r,o;Kn(e)?t=e:Yn(e)&&(t=e.path,n=e.locale,r=e.args,o=e.choice);return{path:t,locale:n,args:r,choice:o}}(t.value),i=a.path,s=a.locale,l=a.args,c=a.choice;if(i||s||l)if(i){var u=n.context;e._vt=e.textContent=null!=c?(r=u.$i18n).tc.apply(r,[i,c].concat(br(s,l))):(o=u.$i18n).t.apply(o,[i].concat(br(s,l))),e._locale=u.$i18n.locale,e._localeMessage=u.$i18n.getLocaleMessage(u.$i18n.locale)}else Qn("`path` is required in v-t directive");else Qn("value type not supported")}function br(e,t){var n=[];return e&&n.push(e),t&&(Array.isArray(t)||Yn(t))&&n.push(t),n}function wr(e,t){void 0===t&&(t={bridge:!1}),wr.installed=!0;var n;(fr=e).version&&Number(fr.version.split(".")[0]);(n=fr).prototype.hasOwnProperty("$i18n")||Object.defineProperty(n.prototype,"$i18n",{get:function(){return this._i18n}}),n.prototype.$t=function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];var r=this.$i18n;return r._t.apply(r,[e,r.locale,r._getMessages(),this].concat(t))},n.prototype.$tc=function(e,t){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];var o=this.$i18n;return o._tc.apply(o,[e,o.locale,o._getMessages(),this,t].concat(n))},n.prototype.$te=function(e,t){var n=this.$i18n;return n._te(e,n.locale,n._getMessages(),t)},n.prototype.$d=function(e){for(var t,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(t=this.$i18n).d.apply(t,[e].concat(n))},n.prototype.$n=function(e){for(var t,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(t=this.$i18n).n.apply(t,[e].concat(n))},fr.mixin(function(e){function t(){this!==this.$root&&this.$options.__INTLIFY_META__&&this.$el&&this.$el.setAttribute("data-intlify",this.$options.__INTLIFY_META__)}return void 0===e&&(e=!1),e?{mounted:t}:{beforeCreate:function(){var e=this.$options;if(e.i18n=e.i18n||(e.__i18nBridge||e.__i18n?{}:null),e.i18n)if(e.i18n instanceof Rr){if(e.__i18nBridge||e.__i18n)try{var t=e.i18n&&e.i18n.messages?e.i18n.messages:{};(e.__i18nBridge||e.__i18n).forEach((function(e){t=ar(t,JSON.parse(e))})),Object.keys(t).forEach((function(n){e.i18n.mergeLocaleMessage(n,t[n])}))}catch(e){0}this._i18n=e.i18n,this._i18nWatcher=this._i18n.watchI18nData()}else if(Yn(e.i18n)){var n=this.$root&&this.$root.$i18n&&this.$root.$i18n instanceof Rr?this.$root.$i18n:null;if(n&&(e.i18n.root=this.$root,e.i18n.formatter=n.formatter,e.i18n.fallbackLocale=n.fallbackLocale,e.i18n.formatFallbackMessages=n.formatFallbackMessages,e.i18n.silentTranslationWarn=n.silentTranslationWarn,e.i18n.silentFallbackWarn=n.silentFallbackWarn,e.i18n.pluralizationRules=n.pluralizationRules,e.i18n.preserveDirectiveContent=n.preserveDirectiveContent),e.__i18nBridge||e.__i18n)try{var r=e.i18n&&e.i18n.messages?e.i18n.messages:{};(e.__i18nBridge||e.__i18n).forEach((function(e){r=ar(r,JSON.parse(e))})),e.i18n.messages=r}catch(e){0}var o=e.i18n.sharedMessages;o&&Yn(o)&&(e.i18n.messages=ar(e.i18n.messages,o)),this._i18n=new Rr(e.i18n),this._i18nWatcher=this._i18n.watchI18nData(),(void 0===e.i18n.sync||e.i18n.sync)&&(this._localeWatcher=this.$i18n.watchLocale()),n&&n.onComponentInstanceCreated(this._i18n)}else 0;else this.$root&&this.$root.$i18n&&this.$root.$i18n instanceof Rr?this._i18n=this.$root.$i18n:e.parent&&e.parent.$i18n&&e.parent.$i18n instanceof Rr&&(this._i18n=e.parent.$i18n)},beforeMount:function(){var e=this.$options;e.i18n=e.i18n||(e.__i18nBridge||e.__i18n?{}:null),e.i18n?(e.i18n instanceof Rr||Yn(e.i18n))&&(this._i18n.subscribeDataChanging(this),this._subscribing=!0):(this.$root&&this.$root.$i18n&&this.$root.$i18n instanceof Rr||e.parent&&e.parent.$i18n&&e.parent.$i18n instanceof Rr)&&(this._i18n.subscribeDataChanging(this),this._subscribing=!0)},mounted:t,beforeDestroy:function(){if(this._i18n){var e=this;this.$nextTick((function(){e._subscribing&&(e._i18n.unsubscribeDataChanging(e),delete e._subscribing),e._i18nWatcher&&(e._i18nWatcher(),e._i18n.destroyVM(),delete e._i18nWatcher),e._localeWatcher&&(e._localeWatcher(),delete e._localeWatcher)}))}}}}(t.bridge)),fr.directive("t",{bind:hr,update:vr,unbind:gr}),fr.component(lr.name,lr),fr.component(dr.name,dr),fr.config.optionMergeStrategies.i18n=function(e,t){return void 0===t?e:t}}var xr=function(){this._caches=Object.create(null)};xr.prototype.interpolate=function(e,t){if(!t)return[e];var n=this._caches[e];return n||(n=function(e){var t=[],n=0,r="";for(;n0)p--,u=4,f[0]();else{if(p=0,void 0===n)return!1;if(!1===(n=Tr(n)))return!1;f[1]()}};null!==u;)if(c++,"\\"!==(t=e[c])||!d()){if(o=Or(t),8===(a=(s=Sr[u])[o]||s.else||8))return;if(u=a[0],(i=f[a[1]])&&(r=void 0===(r=a[2])?t:r,!1===i()))return;if(7===u)return l}}(e))&&(this._cache[e]=t),t||[]},Ar.prototype.getPathValue=function(e,t){if(!Jn(e))return null;var n=this.parsePath(t);if(0===n.length)return null;for(var r=n.length,o=e,a=0;a/,Pr=/(?:@(?:\.[a-z]+)?:(?:[\w\-_|./]+|\([\w\-_|./]+\)))/g,Er=/^@(?:\.([a-z]+))?:/,Lr=/[()]/g,Ir={upper:function(e){return e.toLocaleUpperCase()},lower:function(e){return e.toLocaleLowerCase()},capitalize:function(e){return""+e.charAt(0).toLocaleUpperCase()+e.substr(1)}},Mr=new xr,Rr=function(e){var t=this;void 0===e&&(e={}),!fr&&"undefined"!=typeof window&&window.Vue&&wr(window.Vue);var n=e.locale||"en-US",r=!1!==e.fallbackLocale&&(e.fallbackLocale||"en-US"),o=e.messages||{},a=e.dateTimeFormats||e.datetimeFormats||{},i=e.numberFormats||{};this._vm=null,this._formatter=e.formatter||Mr,this._modifiers=e.modifiers||{},this._missing=e.missing||null,this._root=e.root||null,this._sync=void 0===e.sync||!!e.sync,this._fallbackRoot=void 0===e.fallbackRoot||!!e.fallbackRoot,this._formatFallbackMessages=void 0!==e.formatFallbackMessages&&!!e.formatFallbackMessages,this._silentTranslationWarn=void 0!==e.silentTranslationWarn&&e.silentTranslationWarn,this._silentFallbackWarn=void 0!==e.silentFallbackWarn&&!!e.silentFallbackWarn,this._dateTimeFormatters={},this._numberFormatters={},this._path=new Ar,this._dataListeners=new Set,this._componentInstanceCreatedListener=e.componentInstanceCreatedListener||null,this._preserveDirectiveContent=void 0!==e.preserveDirectiveContent&&!!e.preserveDirectiveContent,this.pluralizationRules=e.pluralizationRules||{},this._warnHtmlInMessage=e.warnHtmlInMessage||"off",this._postTranslation=e.postTranslation||null,this._escapeParameterHtml=e.escapeParameterHtml||!1,"__VUE_I18N_BRIDGE__"in e&&(this.__VUE_I18N_BRIDGE__=e.__VUE_I18N_BRIDGE__),this.getChoiceIndex=function(e,n){var r=Object.getPrototypeOf(t);if(r&&r.getChoiceIndex)return r.getChoiceIndex.call(t,e,n);var o,a;return t.locale in t.pluralizationRules?t.pluralizationRules[t.locale].apply(t,[e,n]):(o=e,a=n,o=Math.abs(o),2===a?o?o>1?1:0:1:o?Math.min(o,2):0)},this._exist=function(e,n){return!(!e||!n)&&(!Xn(t._path.getPathValue(e,n))||!!e[n])},"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||Object.keys(o).forEach((function(e){t._checkLocaleMessage(e,t._warnHtmlInMessage,o[e])})),this._initVM({locale:n,fallbackLocale:r,messages:o,dateTimeFormats:a,numberFormats:i})},Dr={vm:{configurable:!0},messages:{configurable:!0},dateTimeFormats:{configurable:!0},numberFormats:{configurable:!0},availableLocales:{configurable:!0},locale:{configurable:!0},fallbackLocale:{configurable:!0},formatFallbackMessages:{configurable:!0},missing:{configurable:!0},formatter:{configurable:!0},silentTranslationWarn:{configurable:!0},silentFallbackWarn:{configurable:!0},preserveDirectiveContent:{configurable:!0},warnHtmlInMessage:{configurable:!0},postTranslation:{configurable:!0},sync:{configurable:!0}};Rr.prototype._checkLocaleMessage=function(e,t,n){var r=function(e,t,n,o){if(Yn(n))Object.keys(n).forEach((function(a){var i=n[a];Yn(i)?(o.push(a),o.push("."),r(e,t,i,o),o.pop(),o.pop()):(o.push(a),r(e,t,i,o),o.pop())}));else if(Wn(n))n.forEach((function(n,a){Yn(n)?(o.push("["+a+"]"),o.push("."),r(e,t,n,o),o.pop(),o.pop()):(o.push("["+a+"]"),r(e,t,n,o),o.pop())}));else if(Kn(n)){if(jr.test(n)){var a="Detected HTML in message '"+n+"' of keypath '"+o.join("")+"' at '"+t+"'. Consider component interpolation with '' to avoid XSS. See https://bit.ly/2ZqJzkp";"warn"===e?Qn(a):"error"===e&&function(e,t){"undefined"!=typeof console&&(console.error("[vue-i18n] "+e),t&&console.error(t.stack))}(a)}}};r(t,e,n,[])},Rr.prototype._initVM=function(e){var t=fr.config.silent;fr.config.silent=!0,this._vm=new fr({data:e,__VUE18N__INSTANCE__:!0}),fr.config.silent=t},Rr.prototype.destroyVM=function(){this._vm.$destroy()},Rr.prototype.subscribeDataChanging=function(e){this._dataListeners.add(e)},Rr.prototype.unsubscribeDataChanging=function(e){!function(e,t){if(e.delete(t));}(this._dataListeners,e)},Rr.prototype.watchI18nData=function(){var e=this;return this._vm.$watch("$data",(function(){for(var t,n,r=(t=e._dataListeners,n=[],t.forEach((function(e){return n.push(e)})),n),o=r.length;o--;)fr.nextTick((function(){r[o]&&r[o].$forceUpdate()}))}),{deep:!0})},Rr.prototype.watchLocale=function(){if(!this._sync||!this._root)return null;var e=this._vm;return this._root.$i18n.vm.$watch("locale",(function(t){e.$set(e,"locale",t),e.$forceUpdate()}),{immediate:!0})},Rr.prototype.onComponentInstanceCreated=function(e){this._componentInstanceCreatedListener&&this._componentInstanceCreatedListener(e,this)},Dr.vm.get=function(){return this._vm},Dr.messages.get=function(){return tr(this._getMessages())},Dr.dateTimeFormats.get=function(){return tr(this._getDateTimeFormats())},Dr.numberFormats.get=function(){return tr(this._getNumberFormats())},Dr.availableLocales.get=function(){return Object.keys(this.messages).sort()},Dr.locale.get=function(){return this._vm.locale},Dr.locale.set=function(e){this._vm.$set(this._vm,"locale",e)},Dr.fallbackLocale.get=function(){return this._vm.fallbackLocale},Dr.fallbackLocale.set=function(e){this._localeChainCache={},this._vm.$set(this._vm,"fallbackLocale",e)},Dr.formatFallbackMessages.get=function(){return this._formatFallbackMessages},Dr.formatFallbackMessages.set=function(e){this._formatFallbackMessages=e},Dr.missing.get=function(){return this._missing},Dr.missing.set=function(e){this._missing=e},Dr.formatter.get=function(){return this._formatter},Dr.formatter.set=function(e){this._formatter=e},Dr.silentTranslationWarn.get=function(){return this._silentTranslationWarn},Dr.silentTranslationWarn.set=function(e){this._silentTranslationWarn=e},Dr.silentFallbackWarn.get=function(){return this._silentFallbackWarn},Dr.silentFallbackWarn.set=function(e){this._silentFallbackWarn=e},Dr.preserveDirectiveContent.get=function(){return this._preserveDirectiveContent},Dr.preserveDirectiveContent.set=function(e){this._preserveDirectiveContent=e},Dr.warnHtmlInMessage.get=function(){return this._warnHtmlInMessage},Dr.warnHtmlInMessage.set=function(e){var t=this,n=this._warnHtmlInMessage;if(this._warnHtmlInMessage=e,n!==e&&("warn"===e||"error"===e)){var r=this._getMessages();Object.keys(r).forEach((function(e){t._checkLocaleMessage(e,t._warnHtmlInMessage,r[e])}))}},Dr.postTranslation.get=function(){return this._postTranslation},Dr.postTranslation.set=function(e){this._postTranslation=e},Dr.sync.get=function(){return this._sync},Dr.sync.set=function(e){this._sync=e},Rr.prototype._getMessages=function(){return this._vm.messages},Rr.prototype._getDateTimeFormats=function(){return this._vm.dateTimeFormats},Rr.prototype._getNumberFormats=function(){return this._vm.numberFormats},Rr.prototype._warnDefault=function(e,t,n,r,o,a){if(!Xn(n))return n;if(this._missing){var i=this._missing.apply(null,[e,t,r,o]);if(Kn(i))return i}else 0;if(this._formatFallbackMessages){var s=er.apply(void 0,o);return this._render(t,a,s.params,t)}return t},Rr.prototype._isFallbackRoot=function(e){return!e&&!Xn(this._root)&&this._fallbackRoot},Rr.prototype._isSilentFallbackWarn=function(e){return this._silentFallbackWarn instanceof RegExp?this._silentFallbackWarn.test(e):this._silentFallbackWarn},Rr.prototype._isSilentFallback=function(e,t){return this._isSilentFallbackWarn(t)&&(this._isFallbackRoot()||e!==this.fallbackLocale)},Rr.prototype._isSilentTranslationWarn=function(e){return this._silentTranslationWarn instanceof RegExp?this._silentTranslationWarn.test(e):this._silentTranslationWarn},Rr.prototype._interpolate=function(e,t,n,r,o,a,i){if(!t)return null;var s,l=this._path.getPathValue(t,n);if(Wn(l)||Yn(l))return l;if(Xn(l)){if(!Yn(t))return null;if(!Kn(s=t[n])&&!Zn(s))return null}else{if(!Kn(l)&&!Zn(l))return null;s=l}return Kn(s)&&(s.indexOf("@:")>=0||s.indexOf("@.")>=0)&&(s=this._link(e,t,s,r,"raw",a,i)),this._render(s,o,a,n)},Rr.prototype._link=function(e,t,n,r,o,a,i){var s=n,l=s.match(Pr);for(var c in l)if(l.hasOwnProperty(c)){var u=l[c],p=u.match(Er),f=p[0],d=p[1],h=u.replace(f,"").replace(Lr,"");if(nr(i,h))return s;i.push(h);var v=this._interpolate(e,t,h,r,"raw"===o?"string":o,"raw"===o?void 0:a,i);if(this._isFallbackRoot(v)){if(!this._root)throw Error("unexpected error");var g=this._root.$i18n;v=g._translate(g._getMessages(),g.locale,g.fallbackLocale,h,r,o,a)}v=this._warnDefault(e,h,v,r,Wn(a)?a:[a],o),this._modifiers.hasOwnProperty(d)?v=this._modifiers[d](v):Ir.hasOwnProperty(d)&&(v=Ir[d](v)),i.pop(),s=v?s.replace(u,v):s}return s},Rr.prototype._createMessageContext=function(e,t,n,r){var o=this,a=Wn(e)?e:[],i=Jn(e)?e:{},s=this._getMessages(),l=this.locale;return{list:function(e){return a[e]},named:function(e){return i[e]},values:e,formatter:t,path:n,messages:s,locale:l,linked:function(e){return o._interpolate(l,s[l]||{},e,null,r,void 0,[e])}}},Rr.prototype._render=function(e,t,n,r){if(Zn(e))return e(this._createMessageContext(n,this._formatter||Mr,r,t));var o=this._formatter.interpolate(e,n,r);return o||(o=Mr.interpolate(e,n,r)),"string"!==t||Kn(o)?o:o.join("")},Rr.prototype._appendItemToChain=function(e,t,n){var r=!1;return nr(e,t)||(r=!0,t&&(r="!"!==t[t.length-1],t=t.replace(/!/g,""),e.push(t),n&&n[t]&&(r=n[t]))),r},Rr.prototype._appendLocaleToChain=function(e,t,n){var r,o=t.split("-");do{var a=o.join("-");r=this._appendItemToChain(e,a,n),o.splice(-1,1)}while(o.length&&!0===r);return r},Rr.prototype._appendBlockToChain=function(e,t,n){for(var r=!0,o=0;o0;)a[i]=arguments[i+4];if(!e)return"";var s=er.apply(void 0,a);this._escapeParameterHtml&&(s.params=sr(s.params));var l=s.locale||t,c=this._translate(n,l,this.fallbackLocale,e,r,"string",s.params);if(this._isFallbackRoot(c)){if(!this._root)throw Error("unexpected error");return(o=this._root).$t.apply(o,[e].concat(a))}return c=this._warnDefault(l,e,c,r,a,"string"),this._postTranslation&&null!=c&&(c=this._postTranslation(c,e)),c},Rr.prototype.t=function(e){for(var t,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(t=this)._t.apply(t,[e,this.locale,this._getMessages(),null].concat(n))},Rr.prototype._i=function(e,t,n,r,o){var a=this._translate(n,t,this.fallbackLocale,e,r,"raw",o);if(this._isFallbackRoot(a)){if(!this._root)throw Error("unexpected error");return this._root.$i18n.i(e,t,o)}return this._warnDefault(t,e,a,r,[o],"raw")},Rr.prototype.i=function(e,t,n){return e?(Kn(t)||(t=this.locale),this._i(e,t,this._getMessages(),null,n)):""},Rr.prototype._tc=function(e,t,n,r,o){for(var a,i=[],s=arguments.length-5;s-- >0;)i[s]=arguments[s+5];if(!e)return"";void 0===o&&(o=1);var l={count:o,n:o},c=er.apply(void 0,i);return c.params=Object.assign(l,c.params),i=null===c.locale?[c.params]:[c.locale,c.params],this.fetchChoice((a=this)._t.apply(a,[e,t,n,r].concat(i)),o)},Rr.prototype.fetchChoice=function(e,t){if(!e||!Kn(e))return null;var n=e.split("|");return n[t=this.getChoiceIndex(t,n.length)]?n[t].trim():e},Rr.prototype.tc=function(e,t){for(var n,r=[],o=arguments.length-2;o-- >0;)r[o]=arguments[o+2];return(n=this)._tc.apply(n,[e,this.locale,this._getMessages(),null,t].concat(r))},Rr.prototype._te=function(e,t,n){for(var r=[],o=arguments.length-3;o-- >0;)r[o]=arguments[o+3];var a=er.apply(void 0,r).locale||t;return this._exist(n[a],e)},Rr.prototype.te=function(e,t){return this._te(e,this.locale,this._getMessages(),t)},Rr.prototype.getLocaleMessage=function(e){return tr(this._vm.messages[e]||{})},Rr.prototype.setLocaleMessage=function(e,t){"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||this._checkLocaleMessage(e,this._warnHtmlInMessage,t),this._vm.$set(this._vm.messages,e,t)},Rr.prototype.mergeLocaleMessage=function(e,t){"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||this._checkLocaleMessage(e,this._warnHtmlInMessage,t),this._vm.$set(this._vm.messages,e,ar(void 0!==this._vm.messages[e]&&Object.keys(this._vm.messages[e]).length?Object.assign({},this._vm.messages[e]):{},t))},Rr.prototype.getDateTimeFormat=function(e){return tr(this._vm.dateTimeFormats[e]||{})},Rr.prototype.setDateTimeFormat=function(e,t){this._vm.$set(this._vm.dateTimeFormats,e,t),this._clearDateTimeFormat(e,t)},Rr.prototype.mergeDateTimeFormat=function(e,t){this._vm.$set(this._vm.dateTimeFormats,e,ar(this._vm.dateTimeFormats[e]||{},t)),this._clearDateTimeFormat(e,t)},Rr.prototype._clearDateTimeFormat=function(e,t){for(var n in t){var r=e+"__"+n;this._dateTimeFormatters.hasOwnProperty(r)&&delete this._dateTimeFormatters[r]}},Rr.prototype._localizeDateTime=function(e,t,n,r,o){for(var a=t,i=r[a],s=this._getLocaleChain(t,n),l=0;l0;)t[n]=arguments[n+1];var r=this.locale,o=null;return 1===t.length?Kn(t[0])?o=t[0]:Jn(t[0])&&(t[0].locale&&(r=t[0].locale),t[0].key&&(o=t[0].key)):2===t.length&&(Kn(t[0])&&(o=t[0]),Kn(t[1])&&(r=t[1])),this._d(e,r,o)},Rr.prototype.getNumberFormat=function(e){return tr(this._vm.numberFormats[e]||{})},Rr.prototype.setNumberFormat=function(e,t){this._vm.$set(this._vm.numberFormats,e,t),this._clearNumberFormat(e,t)},Rr.prototype.mergeNumberFormat=function(e,t){this._vm.$set(this._vm.numberFormats,e,ar(this._vm.numberFormats[e]||{},t)),this._clearNumberFormat(e,t)},Rr.prototype._clearNumberFormat=function(e,t){for(var n in t){var r=e+"__"+n;this._numberFormatters.hasOwnProperty(r)&&delete this._numberFormatters[r]}},Rr.prototype._getNumberFormatter=function(e,t,n,r,o,a){for(var i=t,s=r[i],l=this._getLocaleChain(t,n),c=0;c0;)t[n]=arguments[n+1];var r=this.locale,o=null,a=null;return 1===t.length?Kn(t[0])?o=t[0]:Jn(t[0])&&(t[0].locale&&(r=t[0].locale),t[0].key&&(o=t[0].key),a=Object.keys(t[0]).reduce((function(e,n){var r;return nr(Hn,n)?Object.assign({},e,((r={})[n]=t[0][n],r)):e}),null)):2===t.length&&(Kn(t[0])&&(o=t[0]),Kn(t[1])&&(r=t[1])),this._n(e,r,o,a)},Rr.prototype._ntp=function(e,t,n,r){if(!Rr.availabilities.numberFormat)return[];if(!n)return(r?new Intl.NumberFormat(t,r):new Intl.NumberFormat(t)).formatToParts(e);var o=this._getNumberFormatter(e,t,this.fallbackLocale,this._getNumberFormats(),n,r),a=o&&o.formatToParts(e);if(this._isFallbackRoot(a)){if(!this._root)throw Error("unexpected error");return this._root.$i18n._ntp(e,t,n,r)}return a||[]},Object.defineProperties(Rr.prototype,Dr),Object.defineProperty(Rr,"availabilities",{get:function(){if(!$r){var e="undefined"!=typeof Intl;$r={dateTimeFormat:e&&void 0!==Intl.DateTimeFormat,numberFormat:e&&void 0!==Intl.NumberFormat}}return $r}}),Rr.install=wr,Rr.version="8.26.5";var Nr=Rr; +/*! + * vssue - A vue-powered issue-based comment plugin + * + * @version v1.4.8 + * @link https://vssue.js.org + * @license MIT + * @copyright 2018-2021 meteorlxy + */ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */function Fr(e,t,n,r){var o,a=arguments.length,i=a<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(t,n,i):o(t,n))||i);return a>3&&i&&Object.defineProperty(t,n,i),i}var zr=a.default.extend({name:"Iconfont"});function Ur(e,t,n,r,o,a,i,s,l,c){"boolean"!=typeof i&&(l=s,s=i,i=!1);const u="function"==typeof n?n.options:n;let p;if(e&&e.render&&(u.render=e.render,u.staticRenderFns=e.staticRenderFns,u._compiled=!0,o&&(u.functional=!0)),r&&(u._scopeId=r),a?(p=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),t&&t.call(this,l(e)),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=p):t&&(p=i?function(e){t.call(this,c(e,this.$root.$options.shadowRoot))}:function(e){t.call(this,s(e))}),p)if(u.functional){const e=u.render;u.render=function(t,n){return p.call(n),e(t,n)}}else{const e=u.beforeCreate;u.beforeCreate=e?[].concat(e,p):[p]}return n}"undefined"!=typeof navigator&&/msie [6-9]\\b/.test(navigator.userAgent.toLowerCase());const Br=Ur({render:function(e,t){var n=t._c;return n("svg",{directives:[{name:"show",rawName:"v-show",value:!1,expression:"false"}]},[n("symbol",{attrs:{id:"vssue-icon-bitbucket",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M579.5522464 489.45249493q4.8371808 38.38537173-30.81752427 61.55702827t-67.95459093 3.66689493q-23.79580907-10.37653333-32.6119616-35.34262826t-0.31207573-50.01020907 31.67573333-35.34262827q21.92335253-11.00068587 44.1587808-7.33379093t39.00952427 21.61127573 16.77409493 41.1160384zM647.19476053 476.65737173q-8.50407573-65.22392427-68.8908192-99.9424t-120.07131413-7.9579424q-38.38537173 17.08617173-61.24495253 53.9111616t-21.0651424 78.95527574q2.41859093 55.4715424 47.20152426 94.48106666t100.87862827 34.1723424q55.4715424-4.8371808 92.60860907-51.18049493t30.50544746-102.43900907zM792.93434133 146.32472427q-12.17097173-16.4620192-34.1723424-27.15062827t-35.34262826-13.41927573-43.30057174-7.64586667q-177.33729493-28.63299093-345.00022826 1.24830507-26.2144 4.29104747-40.25782827 7.33379093t-33.54819093 13.41927573-30.50544747 26.2144q18.2564576 17.08617173 46.34331413 27.6967616t44.78293334 13.41927574 53.36502826 7.02171413q138.95192427 17.71032427 273.06666667 0.62415253 38.38537173-4.8371808 54.53531413-7.33379093t44.1587808-13.1072 45.7191616-28.32091413zM827.65281813 777.10872427q-4.8371808 15.83786667-9.44030506 46.65539093t-8.50407574 51.18049493-17.39824746 42.6764192-35.34262827 34.4064q-52.4288 29.2571424-115.46819093 43.61264747t-123.1140576 13.41927573-122.8019808-11.3127616q-28.0088384-4.8371808-49.69813334-11.00068586t-46.65539093-16.4620192-44.4708576-26.52647574-31.67573333-37.4491424q-15.21371413-58.51428587-34.71847574-177.96144746l3.66689494-9.7523808 11.00068586-5.46133334q135.9091808 90.1900192 308.72137174 90.1900192t309.34552426-90.1900192q12.79512427 3.66689493 14.5895616 14.04342827t-3.0427424 27.46270507-4.8371808 22.54750506zM937.97175147 191.41973333q-15.83786667 101.8148576-67.64251414 399.22346667-3.0427424 18.2564576-16.4620192 34.1723424t-26.52647573 24.3419424-33.23611413 18.88060907q-153.61950507 76.7707424-371.8387808 53.67710506-151.12289493-16.4620192-240.14262827-84.72868586-9.12822827-7.33379093-15.52579093-16.1499424t-10.37653334-21.2992-5.46133333-20.75306667-3.66689493-24.10788587-3.3548192-21.2992q-5.46133333-30.50544747-16.1499424-91.43832426t-17.08617174-98.4600384-14.35550506-89.8779424-13.41927574-96.27550507q1.7944384-15.83786667 10.68860907-29.5692192t19.19268587-22.8595808 27.46270506-18.2564576 28.0088384-13.73135253 29.2571424-11.3127616q76.22460907-28.0088384 190.75657174-39.00952427 231.0144-22.54750507 412.01859093 30.50544747 94.48106667 28.0088384 131.072 74.35215253 9.7523808 12.17097173 10.0644576 31.0515808t-3.3548192 32.9240384z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-gitea",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M184.31868985 236.10860742C106.94832667 235.94086648 3.32655508 285.13080468 9.02973665 408.46209936c8.93218827 192.65010787 206.32096845 210.5144844 285.20099725 212.06608453 8.63864186 36.14810496 101.48307766 160.77938883 170.21479898 167.32127321h301.09442177c180.57278288-11.99345499 315.77172611-546.07960359 215.54670217-548.09249109-165.7696721 7.79993906-264.02374305 11.74184405-348.27147151 12.41280591v166.69224585l-26.25140843-11.61603761-0.16773997-154.99233728c-96.70246985-0.04193548-181.83083757-4.52899687-343.4069947-12.49667687-20.21274496-0.12580547-48.39316992-3.5644886-78.67035236-3.64835859z m10.94507577 68.14462849h9.22573371c10.98701124 98.75729283 28.85138778 156.50200291 64.99949274 244.73357185-92.25734394-10.90314029-170.75995634-37.69970509-185.18564974-137.75698809-7.46445813-51.78991757 17.69663558-105.84433456 110.96042329-107.01851827z m358.83913087 97.07988723c6.29027343 0.08386999 12.70635233 1.25805468 18.74501482 4.02577499l31.40943263 13.54505513-22.51917887 41.05451824a28.18042496 25.03528825 0 0 0-10.10637297 1.59353561 28.18042496 25.03528825 0 0 0-16.98373825 32.038459 28.18042496 25.03528825 0 0 0 4.69673781 7.29671718l-38.83195528 70.70267333a28.18042496 25.03528825 0 0 0-9.30960467 1.59353659 28.18042496 25.03528825 0 0 0-16.98373825 32.038459 28.18042496 25.03528825 0 0 0 36.06423497 15.09665623 28.18042496 25.03528825 0 0 0 16.94180276-32.08039449 28.18042496 25.03528825 0 0 0-6.62575434-9.22573468l37.82551056-68.85752581a28.18042496 25.03528825 0 0 0 12.28700044-1.25805469 28.18042496 25.03528825 0 0 0 8.93218826-4.69673783c14.59343435 6.12253248 26.54495386 11.11281671 35.14166122 15.34826717 12.91602778 6.37414341 17.48696012 10.60959485 18.87082027 15.30633169 1.38386015 4.61286685-0.12580547 13.50312062-7.42252263 29.10299872-5.45157063 11.61603859-14.46762889 28.09655497-25.11915823 47.51253164a28.18042496 25.03528825 0 0 0-10.52572486 1.59353659 28.18042496 25.03528825 0 0 0-16.98373826 32.038459 28.18042496 25.03528825 0 0 0 36.06423498 15.09665623 28.18042496 25.03528825 0 0 0 16.94180278-32.03845901 28.18042496 25.03528825 0 0 0-5.74511608-8.47090188c10.52572388-19.20630122 19.58371762-35.72875308 25.41270465-48.14155897 7.88380904-16.85793279 11.99345499-29.39654416 8.38703091-41.51580463-3.60642311-12.11926046-14.67730434-20.0030695-29.35460966-27.25785217-9.6450856-4.73867233-21.68047607-9.77089106-36.06423399-15.80955357a28.18042496 25.03528825 0 0 0-1.59353562-10.022502 28.18042496 25.03528825 0 0 0-6.08059796-8.7644483l22.14176246-40.38355541 122.61839638 52.96410227c22.14176247 9.6031511 31.2836262 33.12877372 20.54822685 52.8382968l-84.28966393 154.32137544c-10.77733482 19.66758857-37.23841869 27.80300855-59.38018118 18.24179293l-173.48574115-74.98005927c-22.14176247-9.5612156-31.32556167-33.12877372-20.54822687-52.83829679l84.28966395-154.27943995c7.38058716-13.54505513 22.22563246-21.59660511 37.951317-22.22563246h2.68384935z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-gitee",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M978.404275 409.561604H455.061338c-25.117645 0-45.499734 20.382089-45.499734 45.499734l-0.031997 113.781333c0 25.117645 20.350092 45.499734 45.499734 45.531731h318.594132c25.117645 0 45.499734 20.382089 45.499734 45.499735v22.749867a136.5312 136.5312 0 0 1-136.5312 136.5312H250.248539a45.499734 45.499734 0 0 1-45.499734-45.499734V341.343999a136.5312 136.5312 0 0 1 136.5312-136.5312L978.308284 204.780802c25.117645 0 45.499734-20.350092 45.499734-45.467738L1023.904009 45.531731h0.031997A45.499734 45.499734 0 0 0 978.468269 0h-0.031997L341.343999 0.031997C152.84967 0.031997 0.031997 152.84967 0.031997 341.343999v637.092273c0 25.117645 20.382089 45.499734 45.499734 45.499734h671.233072a307.171203 307.171203 0 0 0 307.171203-307.171203v-261.671468c0-25.117645-20.382089-45.499734-45.499734-45.499734z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-github",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M512 20.4425c-278.334 0-504 225.6345-504 504 0 222.6735 144.4275 411.6105 344.673 478.233 25.2 4.662 34.461-10.9305 34.461-24.255 0-12.0015-0.4725-51.723-0.693-93.8385-140.238 30.492-169.8165-59.472-169.8165-59.472-22.932-58.2435-55.944-73.7415-55.944-73.7415-45.738-31.2795 3.465-30.6495 3.465-30.6495 50.589 3.5595 77.238 51.9435 77.238 51.9435 44.9505 77.049 117.9045 54.7785 146.664 41.895 4.5045-32.571 17.577-54.81 32.004-67.41-111.951-12.726-229.635-55.9755-229.635-249.0705 0-55.0305 19.6875-99.981 51.9435-135.2925-5.229-12.6945-22.491-63.945 4.8825-133.371 0 0 42.336-13.545 138.6315 51.66 40.194-11.1825 83.3175-16.758 126.1575-16.9785 42.8085 0.189 85.9635 5.796 126.252 16.9785 96.201-65.205 138.4425-51.66 138.4425-51.66 27.4365 69.426 10.1745 120.6765 4.9455 133.371 32.319 35.28 51.8805 80.262 51.8805 135.2925 0 193.5675-117.9045 236.187-230.139 248.6925 18.081 15.6555 34.1775 46.305 34.1775 93.3345 0 67.4415-0.5985 121.716-0.5985 138.3165 0 13.419 9.072 29.1375 34.6185 24.192 200.151-66.717 344.3895-255.5595 344.3895-478.17 0-278.3655-225.666-504-504-504z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-gitlab",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M66.61375986 405.11600042L512.11376028 976.03999972 23.84576 621.65599958a39.312 39.312 0 0 1-14.07600042-43.30799944l56.8080007-173.26800028z m259.88400014 0h371.26800014L512.14975986 976.03999972zM215.11376 60.88400042l111.384 344.232H66.61375986l111.384-344.232a19.72800014 19.72800014 0 0 1 37.11600014 0z m742.49999972 344.232l56.8080007 173.2679993a39.23999986 39.23999986 0 0 1-14.07600042 43.30800042l-488.26800028 354.38400014 445.50000042-570.92400028z m0 0h-259.88400014l111.384-344.232a19.72800014 19.72800014 0 0 1 37.11600014 0z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-loading",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M843.307 742.24c0 3.217 2.607 5.824 5.824 5.824s5.824-2.607 5.824-5.824a5.823 5.823 0 0 0-5.824-5.824 5.823 5.823 0 0 0-5.824 5.824zM714.731 874.912c0 6.398 5.186 11.584 11.584 11.584s11.584-5.186 11.584-11.584-5.186-11.584-11.584-11.584-11.584 5.186-11.584 11.584zM541.419 943.2c0 9.614 7.794 17.408 17.408 17.408s17.408-7.794 17.408-17.408-7.794-17.408-17.408-17.408-17.408 7.794-17.408 17.408z m-186.56-9.152c0 12.795 10.373 23.168 23.168 23.168s23.168-10.373 23.168-23.168-10.373-23.168-23.168-23.168-23.168 10.373-23.168 23.168zM189.355 849.12c0 16.012 12.98 28.992 28.992 28.992s28.992-12.98 28.992-28.992-12.98-28.992-28.992-28.992-28.992 12.98-28.992 28.992zM74.731 704.736c0 19.228 15.588 34.816 34.816 34.816s34.816-15.588 34.816-34.816-15.588-34.816-34.816-34.816-34.816 15.588-34.816 34.816z m-43.008-177.28c0 22.41 18.166 40.576 40.576 40.576s40.576-18.166 40.576-40.576-18.166-40.576-40.576-40.576-40.576 18.166-40.576 40.576z m35.392-176.128c0 25.626 20.774 46.4 46.4 46.4s46.4-20.774 46.4-46.4c0-25.626-20.774-46.4-46.4-46.4-25.626 0-46.4 20.774-46.4 46.4z m106.176-142.016c0 28.843 23.381 52.224 52.224 52.224s52.224-23.381 52.224-52.224c0-28.843-23.381-52.224-52.224-52.224-28.843 0-52.224 23.381-52.224 52.224z m155.904-81.344c0 32.024 25.96 57.984 57.984 57.984s57.984-25.96 57.984-57.984-25.96-57.984-57.984-57.984-57.984 25.96-57.984 57.984z m175.104-5.056c0 35.24 28.568 63.808 63.808 63.808s63.808-28.568 63.808-63.808c0-35.24-28.568-63.808-63.808-63.808-35.24 0-63.808 28.568-63.808 63.808z m160.32 72.128c0 38.421 31.147 69.568 69.568 69.568s69.568-31.147 69.568-69.568-31.147-69.568-69.568-69.568-69.568 31.147-69.568 69.568z m113.92 135.488c0 41.638 33.754 75.392 75.392 75.392s75.392-33.754 75.392-75.392-33.754-75.392-75.392-75.392-75.392 33.754-75.392 75.392z m45.312 175.488c0 44.854 36.362 81.216 81.216 81.216s81.216-36.362 81.216-81.216c0-44.854-36.362-81.216-81.216-81.216-44.854 0-81.216 36.362-81.216 81.216z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-like",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M885.9 533.7c16.8-22.2 26.1-49.4 26.1-77.7 0-44.9-25.1-87.4-65.5-111.1a67.67 67.67 0 0 0-34.3-9.3H572.4l6-122.9c1.4-29.7-9.1-57.9-29.5-79.4-20.5-21.5-48.1-33.4-77.9-33.4-52 0-98 35-111.8 85.1l-85.9 311H144c-17.7 0-32 14.3-32 32v364c0 17.7 14.3 32 32 32h601.3c9.2 0 18.2-1.8 26.5-5.4 47.6-20.3 78.3-66.8 78.3-118.4 0-12.6-1.8-25-5.4-37 16.8-22.2 26.1-49.4 26.1-77.7 0-12.6-1.8-25-5.4-37 16.8-22.2 26.1-49.4 26.1-77.7-0.2-12.6-2-25.1-5.6-37.1zM184 852V568h81v284h-81z m636.4-353l-21.9 19 13.9 25.4c4.6 8.4 6.9 17.6 6.9 27.3 0 16.5-7.2 32.2-19.6 43l-21.9 19 13.9 25.4c4.6 8.4 6.9 17.6 6.9 27.3 0 16.5-7.2 32.2-19.6 43l-21.9 19 13.9 25.4c4.6 8.4 6.9 17.6 6.9 27.3 0 22.4-13.2 42.6-33.6 51.8H329V564.8l99.5-360.5c5.2-18.9 22.5-32.2 42.2-32.3 7.6 0 15.1 2.2 21.1 6.7 9.9 7.4 15.2 18.6 14.6 30.5l-9.6 198.4h314.4C829 418.5 840 436.9 840 456c0 16.5-7.2 32.1-19.6 43z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-unlike",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M885.9 490.3c3.6-12 5.4-24.4 5.4-37 0-28.3-9.3-55.5-26.1-77.7 3.6-12 5.4-24.4 5.4-37 0-28.3-9.3-55.5-26.1-77.7 3.6-12 5.4-24.4 5.4-37 0-51.6-30.7-98.1-78.3-118.4-8.3-3.6-17.2-5.4-26.5-5.4H144c-17.7 0-32 14.3-32 32v364c0 17.7 14.3 32 32 32h129.3l85.8 310.8C372.9 889 418.9 924 470.9 924c29.7 0 57.4-11.8 77.9-33.4 20.5-21.5 31-49.7 29.5-79.4l-6-122.9h239.9c12.1 0 23.9-3.2 34.3-9.3 40.4-23.5 65.5-66.1 65.5-111 0-28.3-9.3-55.5-26.1-77.7zM184 456V172h81v284h-81z m627.2 160.4H496.8l9.6 198.4c0.6 11.9-4.7 23.1-14.6 30.5-6.1 4.5-13.6 6.8-21.1 6.7-19.6-0.1-36.9-13.4-42.2-32.3L329 459.2V172h415.4c20.4 9.2 33.6 29.4 33.6 51.8 0 9.7-2.3 18.9-6.9 27.3l-13.9 25.4 21.9 19c12.5 10.8 19.6 26.5 19.6 43 0 9.7-2.3 18.9-6.9 27.3l-13.9 25.4 21.9 19c12.5 10.8 19.6 26.5 19.6 43 0 9.7-2.3 18.9-6.9 27.3l-14 25.5 21.9 19c12.5 10.8 19.6 26.5 19.6 43 0 19.1-11 37.5-28.8 48.4z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-heart",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M923 283.6c-13.4-31.1-32.6-58.9-56.9-82.8-24.3-23.8-52.5-42.4-84-55.5-32.5-13.5-66.9-20.3-102.4-20.3-49.3 0-97.4 13.5-139.2 39-10 6.1-19.5 12.8-28.5 20.1-9-7.3-18.5-14-28.5-20.1-41.8-25.5-89.9-39-139.2-39-35.5 0-69.9 6.8-102.4 20.3-31.4 13-59.7 31.7-84 55.5-24.4 23.9-43.5 51.7-56.9 82.8-13.9 32.3-21 66.6-21 101.9 0 33.3 6.8 68 20.3 103.3 11.3 29.5 27.5 60.1 48.2 91 32.8 48.9 77.9 99.9 133.9 151.6 92.8 85.7 184.7 144.9 188.6 147.3l23.7 15.2c10.5 6.7 24 6.7 34.5 0l23.7-15.2c3.9-2.5 95.7-61.6 188.6-147.3 56-51.7 101.1-102.7 133.9-151.6 20.7-30.9 37-61.5 48.2-91 13.5-35.3 20.3-70 20.3-103.3 0.1-35.3-7-69.6-20.9-101.9zM512 814.8S156 586.7 156 385.5C156 283.6 240.3 201 344.3 201c73.1 0 136.5 40.8 167.7 100.4C543.2 241.8 606.6 201 679.7 201c104 0 188.3 82.6 188.3 184.5 0 201.2-356 429.3-356 429.3z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-edit",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M723.2 917.76H286.72c-65.28 0-118.4-51.2-118.4-113.92V261.76C168.32 198.4 221.44 147.2 286.72 147.2h375.04c17.92 0 32 14.08 32 32s-14.08 32-32 32H286.72c-30.08 0-54.4 22.4-54.4 49.92v542.08c0 27.52 24.32 49.92 54.4 49.92H723.2c30.08 0 54.4-22.4 54.4-49.92V440.32c0-17.92 14.08-32 32-32s32 14.08 32 32v363.52c0 62.72-53.12 113.92-118.4 113.92z"}}),t._v(" "),n("path",{attrs:{d:"M499.84 602.24c-7.68 0-14.72-2.56-21.12-7.68-13.44-11.52-14.72-32-3.2-45.44L780.16 198.4c11.52-13.44 32-14.72 45.44-3.2s14.72 32 3.2 45.44L524.16 591.36c-6.4 7.04-15.36 10.88-24.32 10.88z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-delete",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M677.647059 256l0-90.352941c0-37.436235-23.461647-60.235294-61.771294-60.235294L408.094118 105.411765c-38.249412 0-61.741176 22.799059-61.741176 60.235294l0 90.352941-180.705882 0 0 60.235294 60.235294 0 0 512c0 54.272 33.972706 90.352941 90.352941 90.352941l391.529412 0c55.085176 0 90.352941-33.490824 90.352941-90.352941l0-512 60.235294 0 0-60.235294L677.647059 256zM406.588235 165.647059l210.823529 0-1.264941 90.352941L406.588235 256 406.588235 165.647059zM737.882353 858.352941l-451.764706 0 0-542.117647 451.764706 0L737.882353 858.352941zM466.823529 376.470588l-58.729412 0-1.505882 391.529412 60.235294 0L466.823529 376.470588zM617.411765 376.470588l-60.235294 0 0 391.529412 60.235294 0L617.411765 376.470588z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-reply",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M426.666667 384 426.666667 213.333333 128 512 426.666667 810.666667 426.666667 635.733333C640 635.733333 789.333333 704 896 853.333333 853.333333 640 725.333333 426.666667 426.666667 384Z"}})]),t._v(" "),n("symbol",{attrs:{id:"vssue-icon-error",viewBox:"0 0 1024 1024"}},[n("path",{attrs:{d:"M512 720m-48 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0Z"}}),t._v(" "),n("path",{attrs:{d:"M480 416v184c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V416c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8z"}}),t._v(" "),n("path",{attrs:{d:"M955.7 856l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48z m-783.5-27.9L512 239.9l339.8 588.2H172.2z"}})])])},staticRenderFns:[]},void 0,zr,void 0,!0,void 0,!1,void 0,void 0,void 0);const qr=Ur({},void 0,a.default.extend({name:"TransitionFade",functional:!0,props:{group:{type:Boolean,required:!1,default:!1},tag:{type:String,required:!1,default:"div"}},render:(e,{props:t,children:n})=>e(t.group?"TransitionGroup":"Transition",{props:{name:"fade",mode:"out-in",appear:!0,tag:t.tag}},n)}),void 0,void 0,void 0,!1,void 0,void 0,void 0);const Vr=Ur({},void 0,a.default.extend({name:"VssueIcon",functional:!0,props:{name:{type:String,required:!0},title:{type:String,required:!1,default:null}},render:(e,{props:t,data:n})=>e("svg",Object.assign(Object.assign({},n),{class:["vssue-icon","vssue-icon-"+t.name],attrs:{"aria-hidden":"true"}}),[e("title",t.title),e("use",{attrs:{"xlink:href":"#vssue-icon-"+t.name}})])}),void 0,void 0,void 0,!1,void 0,void 0,void 0);let Hr=class extends a.default{constructor(){super(...arguments),this.editMode=!1,this.editContent=this.comment.contentRaw,this.creatingReactions=[],this.isPutingComment=!1,this.isDeletingComment=!1}get currentUser(){return this.vssue.user?this.vssue.user.username:null}get content(){return this.comment.content}get author(){return this.comment.author}get createdAt(){return Bn(this.comment.createdAt)}get updatedAt(){return Bn(this.comment.updatedAt)}get showReactions(){return Boolean(this.vssue.API&&this.vssue.API.platform.meta.reactable&&this.comment.reactions&&!this.editMode)}get reactionKeys(){return["heart","like","unlike"]}get editContentRows(){return this.editContent.split("\n").length-1}get editInputRows(){return this.editContentRows<3?5:this.editContentRows+2}async postReaction({reaction:e}){try{if(this.creatingReactions.includes(e))return;this.creatingReactions.push(e);await this.vssue.postCommentReaction({commentId:this.comment.id,reaction:e})||this.vssue.$emit("error",new Error(this.vssue.$t("reactionGiven",{reaction:this.vssue.$t(e)})));const t=await this.vssue.getCommentReactions({commentId:this.comment.id});t&&(this.comment.reactions=t)}finally{this.creatingReactions.splice(this.creatingReactions.findIndex(t=>t===e),1)}}enterEdit(){this.editMode=!0,this.$nextTick(()=>{this.$refs.input.focus()})}resetEdit(){this.editMode=!1,this.editContent=this.comment.contentRaw}async putComment(){try{if(this.vssue.isPending)return;if(this.editContent!==this.comment.contentRaw){this.isPutingComment=!0,this.vssue.isUpdatingComment=!0;const e=await this.vssue.putComment({commentId:this.comment.id,content:this.editContent});e&&this.vssue.comments.data.splice(this.vssue.comments.data.findIndex(e=>e.id===this.comment.id),1,e)}this.editMode=!1}finally{this.isPutingComment=!1,this.vssue.isUpdatingComment=!1}}async deleteComment(){try{if(this.vssue.isPending)return;if(!window.confirm(this.vssue.$t("deleteConfirm")))return;this.isDeletingComment=!0,this.vssue.isUpdatingComment=!0;await this.vssue.deleteComment({commentId:this.comment.id})?(this.vssue.comments.count-=1,this.vssue.comments.data.length>1&&this.vssue.comments.data.splice(this.vssue.comments.data.findIndex(e=>e.id===this.comment.id),1),this.vssue.query.page>1&&this.vssue.query.page>Math.ceil(this.vssue.comments.count/this.vssue.query.perPage)?this.vssue.query.page-=1:await this.vssue.getComments()):this.vssue.$emit("error",new Error(this.vssue.$t("deleteFailed")))}finally{this.isDeletingComment=!1,this.vssue.isUpdatingComment=!1}}};Fr([In({type:Object,required:!0})],Hr.prototype,"comment",void 0),Fr([Tn()],Hr.prototype,"vssue",void 0),Hr=Fr([Object(On.b)({components:{VssueIcon:Vr}})],Hr);const Qr=Ur({render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"vssue-comment",class:{"vssue-comment-edit-mode":e.editMode,"vssue-comment-disabled":e.isDeletingComment||e.isPutingComment}},[n("div",{staticClass:"vssue-comment-avatar"},[n("a",{attrs:{href:e.author.homepage,title:e.author.username,target:"_blank",rel:"noopener noreferrer"}},[n("img",{attrs:{src:e.author.avatar,alt:e.author.username}})])]),e._v(" "),n("div",{staticClass:"vssue-comment-body"},[e._t("body",[n("div",{staticClass:"vssue-comment-header"},[n("span",{staticClass:"vssue-comment-author"},[n("a",{attrs:{href:e.author.homepage,title:e.author.username,target:"_blank",rel:"noopener noreferrer"}},[e._v("\n "+e._s(e.author.username)+"\n ")])]),e._v(" "),n("span",{staticClass:"vssue-comment-created-at"},[e._v("\n "+e._s(e.createdAt)+"\n ")])]),e._v(" "),n("div",{staticClass:"vssue-comment-main"},[e.editMode?n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.editContent,expression:"editContent"}],ref:"input",staticClass:"vssue-edit-comment-input",attrs:{rows:e.editInputRows},domProps:{value:e.editContent},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:t.ctrlKey?e.putComment():null},input:function(t){t.target.composing||(e.editContent=t.target.value)}}}):n("article",{staticClass:"markdown-body",domProps:{innerHTML:e._s(e.content)}})]),e._v(" "),n("div",{staticClass:"vssue-comment-footer"},[e.editMode?n("span",{staticClass:"vssue-comment-hint"},[e._v("\n "+e._s(e.vssue.$t("editMode"))+"\n ")]):e._e(),e._v(" "),e.showReactions?n("span",{staticClass:"vssue-comment-reactions"},e._l(e.reactionKeys,(function(t){return n("span",{key:t,staticClass:"vssue-comment-reaction",attrs:{title:e.vssue.$t(e.creatingReactions.includes(t)?"loading":t)},on:{click:function(n){return e.postReaction({reaction:t})}}},[n("VssueIcon",{attrs:{name:e.creatingReactions.includes(t)?"loading":t,title:e.vssue.$t(e.creatingReactions.includes(t)?"loading":t)}}),e._v(" "),n("span",{staticClass:"vssue-comment-reaction-number"},[e._v("\n "+e._s(e.comment.reactions[t])+"\n ")])],1)})),0):e._e(),e._v(" "),n("span",{staticClass:"vssue-comment-operations"},[e.comment.author.username===e.currentUser&&e.editMode?n("span",{staticClass:"vssue-comment-operation",class:{"vssue-comment-operation-muted":e.isPutingComment},attrs:{title:e.vssue.$t(e.isPutingComment?"loading":"submit")},on:{click:function(t){return e.putComment()}}},[n("VssueIcon",{directives:[{name:"show",rawName:"v-show",value:e.isPutingComment,expression:"isPutingComment"}],attrs:{name:"loading",title:e.vssue.$t("loading")}}),e._v("\n\n "+e._s(e.vssue.$t("submit"))+"\n ")],1):e._e(),e._v(" "),e.comment.author.username===e.currentUser&&e.editMode?n("span",{staticClass:"vssue-comment-operation vssue-comment-operation-muted",attrs:{title:e.vssue.$t("cancel")},on:{click:function(t){return e.resetEdit()}}},[e._v("\n "+e._s(e.vssue.$t("cancel"))+"\n ")]):e._e(),e._v(" "),e.comment.author.username===e.currentUser?n("span",{directives:[{name:"show",rawName:"v-show",value:!e.editMode,expression:"!editMode"}],staticClass:"vssue-comment-operation",on:{click:function(t){return e.enterEdit()}}},[n("VssueIcon",{attrs:{name:"edit",title:e.vssue.$t("edit")}})],1):e._e(),e._v(" "),e.comment.author.username===e.currentUser||e.vssue.isAdmin?n("span",{directives:[{name:"show",rawName:"v-show",value:!e.editMode,expression:"!editMode"}],staticClass:"vssue-comment-operation",on:{click:function(t){return e.deleteComment()}}},[n("VssueIcon",{attrs:{name:e.isDeletingComment?"loading":"delete",title:e.vssue.$t(e.isDeletingComment?"loading":"delete")}})],1):e._e(),e._v(" "),n("span",{directives:[{name:"show",rawName:"v-show",value:!e.editMode,expression:"!editMode"}],staticClass:"vssue-comment-operation",on:{click:function(t){return e.vssue.$emit("reply-comment",e.comment)}}},[n("VssueIcon",{attrs:{name:"reply",title:e.vssue.$t("reply")}})],1)])])])],2)])},staticRenderFns:[]},void 0,Hr,void 0,!1,void 0,!1,void 0,void 0,void 0);let Wr=class extends a.default{get disabled(){return this.vssue.isPending}get pageCount(){const e=Math.ceil(this.vssue.comments.count/this.vssue.comments.perPage);return e>1?e:1}get perPageOptions(){const e=[5,10,20,50];return!e.includes(this.vssue.options.perPage)&&this.vssue.options.perPage<100&&e.push(this.vssue.options.perPage),e.sort((e,t)=>e-t)}get page(){return this.vssue.query.page>this.pageCount?this.pageCount:this.vssue.query.page}set page(e){e>0&&e<=this.pageCount&&(this.vssue.query.page=e)}get perPage(){return this.vssue.query.perPage}set perPage(e){this.perPageOptions.includes(e)&&(this.vssue.query.perPage=e)}};Fr([Tn()],Wr.prototype,"vssue",void 0),Wr=Fr([Object(On.b)({components:{VssueIcon:Vr}})],Wr);const Jr=Ur({render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"vssue-pagination"},[n("div",{staticClass:"vssue-pagination-per-page"},[n("label",[n("select",{directives:[{name:"model",rawName:"v-model",value:e.perPage,expression:"perPage"}],staticClass:"vssue-pagination-select",attrs:{disabled:e.disabled},on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return"_value"in e?e._value:e.value}));e.perPage=t.target.multiple?n:n[0]}}},e._l(e.perPageOptions,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v("\n "+e._s(t)+"\n ")])})),0),e._v(" "),n("span",[e._v("\n "+e._s(e.vssue.$t("perPage"))+"\n ")])]),e._v(" "),e.vssue.API.platform.meta.sortable?n("span",{class:{"vssue-pagination-link":!0,disabled:e.disabled},attrs:{title:e.vssue.$t("sort")},on:{click:function(t){e.vssue.query.sort="asc"===e.vssue.query.sort?"desc":"asc"}}},[e._v("\n "+e._s("asc"===e.vssue.query.sort?"↑":"↓")+"\n ")]):e._e()]),e._v(" "),n("div",{staticClass:"vssue-pagination-page"},[n("span",{class:{"vssue-pagination-link":!0,disabled:1===e.page||e.disabled},attrs:{title:e.vssue.$t("prev")},domProps:{textContent:e._s("<")},on:{click:function(t){e.page-=1}}}),e._v(" "),n("label",[n("span",[e._v("\n "+e._s(e.vssue.$t("page"))+"\n ")]),e._v(" "),n("select",{directives:[{name:"show",rawName:"v-show",value:e.pageCount>1,expression:"pageCount > 1"},{name:"model",rawName:"v-model",value:e.page,expression:"page"}],staticClass:"vssue-pagination-select",attrs:{disabled:e.disabled},on:{change:function(t){var n=Array.prototype.filter.call(t.target.options,(function(e){return e.selected})).map((function(e){return"_value"in e?e._value:e.value}));e.page=t.target.multiple?n:n[0]}}},e._l(e.pageCount,(function(t){return n("option",{key:t,domProps:{value:t}},[e._v("\n "+e._s(t)+"\n ")])})),0),e._v(" "),n("span",{directives:[{name:"show",rawName:"v-show",value:e.pageCount<2,expression:"pageCount < 2"}],domProps:{textContent:e._s(e.page)}}),e._v(" "),n("span",{domProps:{textContent:e._s(" / "+e.pageCount+" ")}})]),e._v(" "),n("span",{class:{"vssue-pagination-link":!0,disabled:e.page===e.pageCount||e.disabled},attrs:{title:e.vssue.$t("next")},domProps:{textContent:e._s(">")},on:{click:function(t){e.page+=1}}})])])},staticRenderFns:[]},void 0,Wr,void 0,!1,void 0,!1,void 0,void 0,void 0);let Kr=class extends a.default{};Fr([Tn()],Kr.prototype,"vssue",void 0),Kr=Fr([Object(On.b)({components:{TransitionFade:qr,VssueComment:Qr,VssuePagination:Jr}})],Kr);const Gr=Ur({render:function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"vssue-comments"},[t("VssuePagination"),this._v(" "),t("TransitionFade",{attrs:{group:""}},this._l(this.vssue.comments.data,(function(e){return t("VssueComment",{key:e.id,attrs:{comment:e}})})),1),this._v(" "),t("VssuePagination",{directives:[{name:"show",rawName:"v-show",value:this.vssue.comments.data.length>5,expression:"vssue.comments.data.length > 5"}]})],1)},staticRenderFns:[]},void 0,Kr,void 0,!1,void 0,!1,void 0,void 0,void 0);const Yr=Ur({},void 0,a.default.extend({name:"VssueIcon",functional:!0,props:{type:{type:String,required:!1,default:"default"}},render:(e,{props:t,data:n,children:r})=>e("button",Object.assign(Object.assign({},n),{class:["vssue-button","vssue-button-"+t.type]}),r)}),void 0,void 0,void 0,!1,void 0,void 0,void 0);let Xr=class extends a.default{constructor(){super(...arguments),this.content=""}get user(){return this.vssue.user}get platform(){return this.vssue.API&&this.vssue.API.platform.name}get isInputDisabled(){return this.loading||null===this.user||null===this.vssue.issue}get isSubmitDisabled(){return""===this.content||this.vssue.isPending||null===this.vssue.issue}get loading(){return this.vssue.isCreatingComment}get contentRows(){return this.content.split("\n").length-1}get inputRows(){return this.contentRows<3?5:this.contentRows+2}created(){this.vssue.$on("reply-comment",e=>{const t=e.contentRaw.replace(/\n/g,"\n> "),n=`@${e.author.username}\n\n> ${t}\n\n`;this.content=this.content.concat(n),this.focus()})}beforeDestroy(){this.vssue.$off("reply-comment")}focus(){this.$refs.input.focus()}async submit(){this.isSubmitDisabled||(await this.vssue.postComment({content:this.content}),this.content="",await this.vssue.getComments())}};Fr([Tn()],Xr.prototype,"vssue",void 0),Xr=Fr([Object(On.b)({components:{VssueButton:Yr,VssueIcon:Vr}})],Xr);const Zr=Ur({render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"vssue-new-comment"},[n("div",{staticClass:"vssue-comment-avatar"},[e.user?n("a",{attrs:{href:e.user.homepage,title:e.user.username,target:"_blank",rel:"noopener noreferrer"}},[n("img",{attrs:{src:e.user.avatar,alt:e.user.username}})]):n("VssueIcon",{attrs:{name:e.platform.toLowerCase(),title:e.vssue.$t("loginToComment",{platform:e.platform})},on:{click:function(t){return e.vssue.login()}}})],1),e._v(" "),n("div",{staticClass:"vssue-new-comment-body"},[n("textarea",{directives:[{name:"model",rawName:"v-model",value:e.content,expression:"content"}],ref:"input",staticClass:"vssue-new-comment-input",attrs:{rows:e.inputRows,disabled:e.isInputDisabled,placeholder:e.vssue.$t(e.user?"placeholder":"noLoginPlaceHolder"),spellcheck:!1,"aria-label":"leave a comment"},domProps:{value:e.content},on:{keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:t.ctrlKey?e.submit():null},input:function(t){t.target.composing||(e.content=t.target.value)}}})]),e._v(" "),n("div",{staticClass:"vssue-new-comment-footer"},[e.user?n("span",{staticClass:"vssue-current-user"},[n("span",[e._v(e._s(e.vssue.$t("currentUser"))+" - "+e._s(e.user.username)+" - ")]),e._v(" "),n("a",{staticClass:"vssue-logout",on:{click:function(t){return e.vssue.logout()}}},[e._v("\n "+e._s(e.vssue.$t("logout"))+"\n ")])]):n("span",{staticClass:"vssue-current-user"},[e._v("\n "+e._s(e.vssue.$t("loginToComment",{platform:e.platform}))+"\n ")]),e._v(" "),n("div",{staticClass:"vssue-new-comment-operations"},[e.user?n("VssueButton",{staticClass:"vssue-button-submit-comment",attrs:{type:"primary",disabled:e.isSubmitDisabled},on:{click:function(t){return e.submit()}}},[n("VssueIcon",{directives:[{name:"show",rawName:"v-show",value:e.loading,expression:"loading"}],attrs:{name:"loading"}}),e._v("\n\n "+e._s(e.vssue.$t(e.loading?"submitting":"submitComment"))+"\n ")],1):n("VssueButton",{staticClass:"vssue-button-login",attrs:{type:"primary",title:e.vssue.$t("loginToComment",{platform:e.platform})},on:{click:function(t){return e.vssue.login()}}},[e._v("\n "+e._s(e.vssue.$t("login",{platform:e.platform}))+"\n ")])],1)])])},staticRenderFns:[]},void 0,Xr,void 0,!1,void 0,!1,void 0,void 0,void 0);let eo=class extends a.default{constructor(){super(...arguments),this.progress={show:!1,percent:0,timer:null,speed:200},this.alert={show:!1,message:null,timer:null}}onLoadingCommentsChange(e){this.vssue.comments&&(e?this.progressStart():this.progressDone())}created(){this.vssue.$on("error",e=>this.alertShow(e.message))}beforeDestroy(){this.vssue.$off("error"),null!==this.progress.timer&&window.clearTimeout(this.progress.timer),null!==this.alert.timer&&window.clearTimeout(this.alert.timer)}progressStart(){this.progress.show=!0,this.progress.percent=0,this.progress.timer=window.setInterval(()=>{this.progress.percent+=5,this.progress.percent>94&&null!==this.progress.timer&&window.clearInterval(this.progress.timer)},this.progress.speed)}progressDone(){this.progress.percent=100,null!==this.progress.timer&&window.clearTimeout(this.progress.timer),this.progress.timer=null,window.setTimeout(()=>{this.progress.show=!1},this.progress.speed)}alertShow(e){this.alert.show=!0,this.alert.message=e,null!==this.alert.timer&&window.clearTimeout(this.alert.timer),this.alert.timer=window.setTimeout(()=>{this.alertHide()},3e3)}alertHide(){this.alert.show=!1,null!==this.alert.timer&&window.clearTimeout(this.alert.timer),this.alert.timer=null}};Fr([Tn()],eo.prototype,"vssue",void 0),Fr([Mn("vssue.isLoadingComments")],eo.prototype,"onLoadingCommentsChange",null),eo=Fr([Object(On.b)({components:{TransitionFade:qr}})],eo);const to=Ur({render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"vssue-notice"},[n("div",{directives:[{name:"show",rawName:"v-show",value:e.progress.show,expression:"progress.show"}],staticClass:"vssue-progress",style:{width:e.progress.percent+"%",transition:"all "+e.progress.speed+"ms linear"}}),e._v(" "),n("TransitionFade",[n("div",{directives:[{name:"show",rawName:"v-show",value:e.alert.show,expression:"alert.show"}],staticClass:"vssue-alert",domProps:{textContent:e._s(e.alert.message)},on:{click:function(t){return e.alertHide()}}})])],1)},staticRenderFns:[]},void 0,eo,void 0,!1,void 0,!1,void 0,void 0,void 0);let no=class extends a.default{get status(){return this.vssue.isFailed?"failed":this.vssue.isInitializing?"initializing":this.vssue.isIssueNotCreated&&!this.vssue.isCreatingIssue?this.vssue.isAdmin||!this.vssue.isLogined?"issueNotCreated":"failed":this.vssue.isLoginRequired?"loginRequired":!this.vssue.comments||this.vssue.isCreatingIssue?"loadingComments":0===this.vssue.comments.data.length?"noComments":null}handleClick(){"issueNotCreated"===this.status?this.vssue.postIssue():"loginRequired"===this.status&&this.vssue.login()}};Fr([Tn()],no.prototype,"vssue",void 0),no=Fr([Object(On.b)({components:{TransitionFade:qr,VssueIcon:Vr}})],no);const ro=Ur({render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("TransitionFade",[e.status?n("div",{key:e.status,staticClass:"vssue-status"},[["failed","loadingComments","initializing"].includes(e.status)?n("VssueIcon",{attrs:{name:"failed"===e.status?"error":"loading"}}):e._e(),e._v(" "),n("p",{staticClass:"vssue-status-info"},[n(["issueNotCreated","loginRequired"].includes(e.status)?"a":"span",{tag:"Component",on:{click:e.handleClick}},[e._v("\n "+e._s(e.vssue.$t(e.status))+"\n ")])],1)],1):e._e()])},staticRenderFns:[]},void 0,no,void 0,!1,void 0,!1,void 0,void 0,void 0);let oo=class extends a.default{};Fr([Tn()],oo.prototype,"vssue",void 0),oo=Fr([Object(On.b)({components:{TransitionFade:qr,VssueIcon:Vr,VssueComments:Gr,VssueNewComment:Zr,VssueNotice:to,VssueStatus:ro}})],oo);const ao=Ur({render:function(){var e=this.$createElement,t=this._self._c||e;return t("TransitionFade",[this.vssue.isInitializing?t("VssueStatus"):t("div",{staticClass:"vssue-body"},[this.vssue.API?t("VssueNewComment"):this._e(),this._v(" "),t("VssueNotice"),this._v(" "),t("TransitionFade",[this.vssue.comments&&this.vssue.comments.data.length>0?t("VssueComments"):t("VssueStatus")],1)],1)],1)},staticRenderFns:[]},void 0,oo,void 0,!1,void 0,!1,void 0,void 0,void 0);let io=class extends a.default{};Fr([Tn()],io.prototype,"vssue",void 0),io=Fr([On.b],io);const so=Ur({render:function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"vssue-header"},[n("a",{staticClass:"vssue-header-comments-count",attrs:{href:e.vssue.issue?e.vssue.issue.link:null,target:"_blank",rel:"noopener noreferrer"}},[n("span",[e._v("\n "+e._s(e.vssue.comments?e.vssue.$tc("comments",e.vssue.comments.count,{count:e.vssue.comments.count}):e.vssue.$tc("comments",0))+"\n ")])]),e._v(" "),n("span",{staticClass:"vssue-header-powered-by"},[n("span",[e._v("Powered by")]),e._v(" "),e.vssue.API?n("span",[n("a",{attrs:{href:e.vssue.API.platform.link,title:e.vssue.API.platform.name+" API "+e.vssue.API.platform.version,target:"_blank",rel:"noopener noreferrer"}},[e._v("\n "+e._s(e.vssue.API.platform.name)+"\n ")]),e._v(" "),n("span",[e._v("&")])]):e._e(),e._v(" "),n("a",{attrs:{href:"https://github.com/meteorlxy/vssue",title:"Vssue v"+e.vssue.version,target:"_blank",rel:"noopener noreferrer"}},[e._v("\n Vssue\n ")])])])},staticRenderFns:[]},void 0,io,void 0,!1,void 0,!1,void 0,void 0,void 0),lo={login:"Login with {platform}",logout:"Logout",currentUser:"Current User",loading:"Loading",submit:"Submit",submitting:"Submitting",submitComment:"Submit Comment",cancel:"Cancel",edit:"Edit",editMode:"Edit Mode",delete:"Delete",reply:"Reply",heart:"Heart",like:"Like",unlike:"Unlike",perPage:"Comments per page",sort:"Click to change the sort direction",page:"Page",prev:"Previous Page",next:"Next Page",comments:"Comments | {count} Comment | {count} Comments",loginToComment:"Login with {platform} account to leave a comment",placeholder:"Leave a comment. Styling with Markdown is supported. Ctrl + Enter to submit.",noLoginPlaceHolder:"Login to leave a comment. Styling with Markdown is supported. ",failed:"Failed to load comments",initializing:"Initializing...",issueNotCreated:"Click to create issue",loadingComments:"Loading comments...",loginRequired:"Login to view comments",noComments:"No comments yet. Leave the first comment !",reactionGiven:"Already given '{reaction}' reaction",deleteConfirm:"Confirm to delete this comment ?",deleteFailed:"Failed to delete comment"},co={login:"使用 {platform} 登录",logout:"退出登录",currentUser:"当前用户",loading:"加载中",submit:"提交",submitting:"发表中",submitComment:"发表评论",cancel:"取消",edit:"编辑",editMode:"编辑模式",delete:"删除",reply:"回复",heart:"喜欢",like:"赞",unlike:"踩",perPage:"每页评论数",sort:"点击改变排序方式",page:"页数",prev:"上一页",next:"下一页",comments:"评论 | {count} 条评论 | {count} 条评论",loginToComment:"使用 {platform} 帐号登录后发表评论",placeholder:"留下你的评论丨支持 Markdown 语法丨Ctrl + Enter 发表评论",noLoginPlaceHolder:"登录后才能发表评论丨支持 Markdown 语法",failed:"评论加载失败",initializing:"正在初始化...",issueNotCreated:"点击创建 Issue",loadingComments:"正在加载评论...",loginRequired:"登录后查看评论",noComments:"还没有评论,来发表第一条评论吧!",reactionGiven:"已经添加过 '{reaction}' 了",deleteConfirm:"确认要删除该评论吗?",deleteFailed:"评论删除失败"},uo={login:"Entrar com {platform}",logout:"Sair",currentUser:"Usuário Atual",loading:"Carregando",submit:"Enviar",submitting:"Enviando",submitComment:"Enviar Comentário",cancel:"Cancelar",edit:"Editar",editMode:"Modo de Edição",delete:"Apagar",reply:"Responder",heart:"Heart",like:"Like",unlike:"Unlike",perPage:"Comentários por página",sort:"Clique para alterar a ordenação",page:"Página",prev:"Página Anterior",next:"Próxima Página",comments:"Comentários | {count} Comentário | {count} Comentários",loginToComment:"Entre com uma conta {platform} para deixar um comentário",placeholder:"Deixe um comentário. Estilos com Markdown suportados. Ctrl + Enter para enviar.",noLoginPlaceHolder:"Entre para deixar um comentário. Estilos com Markdown suportados. ",failed:"Falha ao carregar comentários",initializing:"Inicializando...",issueNotCreated:"Click to create issue",loadingComments:"Carregando comentários...",loginRequired:"Entrar para visualizar comentários",noComments:"Nenhum comentário. Deixe o primeiro comentário!",reactionGiven:"Já reagiu com '{reaction}'",deleteConfirm:"Apagar este comentário?",deleteFailed:"Falha ao apagar comentário"},po={login:"{platform} でログイン",logout:"ログアウト",currentUser:"現在のユーザー",loading:"読み込み中",submit:"送信",submitting:"送信中",submitComment:"コメントを送信",cancel:"キャンセル",edit:"編集",editMode:"編集モード",delete:"削除",reply:"返信",heart:"ハート",like:"高評価",unlike:"低評価",perPage:"コメント/ページ",sort:"並び順を変更するにはクリックしてください",page:"ページ",prev:"前のページ",next:"次のページ",comments:"コメント | {count} コメント | {count} コメント",loginToComment:"コメントを残すには {platform} アカウントでログインしてください。",placeholder:"コメントを残してください。Markdown 記法をサポートしています。 Ctrl + Enter で送信できます。",noLoginPlaceHolder:"コメントを残すにはログインしてください。マークダウン記法をサポートしています。",failed:"コメントの読み込みに失敗しました",initializing:"初期化中...",issueNotCreated:"Click to create issue",loadingComments:"コメントの読み込み中...",loginRequired:"コメントを見るにはログインしてください",noComments:"まだコメントがありません。最初のコメントを残しましょう!",reactionGiven:"既に '{reaction}' のリアクションをしています",deleteConfirm:"本当にコメントを削除してもいいですか?",deleteFailed:"コメントの削除に失敗しました"},fo={login:"התחברו עם {platform}",logout:"התנתקו",currentUser:"משתמש/ת נוכחי/ת",loading:"טוען",submit:"שליחה",submitting:"שולח",submitComment:"שליחת תגובה",cancel:"ביטל",edit:"עריכה",editMode:"מצב עריכה",delete:"מחיקה",reply:"תשובה",heart:"לב",like:"לייק",unlike:"אנלייק",perPage:"תגובות לדף",sort:"לחצו כדי לשנות את כיוון המיון",page:"דף",prev:"הדף הקודם",next:"הדף הבא",comments:"תגובות | {count} תגובה | {count} תגובות",loginToComment:"התחברו עם חשבון {platform} כדי להשאיר תגובה",placeholder:"השאירו תגובה. יש תמיכה בעיצוב בעזרת Markdown. Ctrl + Enter כדי לשלוח.",noLoginPlaceHolder:"התחברו כדי להשאיר תגובה. יש תמיכה בעיצוב בעזרת Markdown. ",failed:"כשלון בטעינת התגובות",initializing:"מאתחל...",issueNotCreated:"לחצו ליצירת issue",loadingComments:"טוען תגובות...",loginRequired:"התחברו כדי לצפות בתגובות",noComments:"עדיין אין תגובות. השאירו תגובה ראשונה !",reactionGiven:"כבר ניתן חיווי '{reaction}'",deleteConfirm:"בטוחים במחיקת התגובה ?",deleteFailed:"כשלון במחיקת התגובה"};Object.prototype.hasOwnProperty.call(a.default,"$i18n")||a.default.use(Nr);const ho=new Nr({locale:"en",fallbackLocale:"en",messages:{en:lo,"en-US":lo,zh:co,"zh-CN":co,pt:uo,"pt-BR":uo,ja:po,"ja-JP":po,he:fo,"he-IL":fo}});let vo=class extends a.default{constructor(){super(...arguments),this.title=e=>`${e.prefix}${document.title}`,this.issueId=null,this.options=null,this.API=null,this.accessToken=null,this.user=null,this.issue=null,this.comments=null,this.query={page:1,perPage:10,sort:"desc"},this.isInitializing=!0,this.isIssueNotCreated=!1,this.isLoginRequired=!1,this.isFailed=!1,this.isCreatingIssue=!1,this.isLoadingComments=!1,this.isCreatingComment=!1,this.isUpdatingComment=!1}get version(){return"1.4.8"}get issueTitle(){return null===this.options?"":"function"==typeof this.title?this.title(this.options):`${this.options.prefix}${this.title}`}get isPending(){return this.isLoadingComments||this.isCreatingComment||this.isUpdatingComment}get isLogined(){return null!==this.accessToken&&null!==this.user}get isAdmin(){return null!==this.options&&null!==this.accessToken&&null!==this.user&&(this.user.username===this.options.owner||this.options.admins.includes(this.user.username))}get accessTokenKey(){return this.API?`Vssue.${this.API.platform.name.toLowerCase()}.access_token`:""}onQueryPerPageChange(){this.query.page=1,this.getComments()}onQueryChange(){this.getComments()}setOptions(e){this.options=Object.assign({labels:["Vssue"],state:"Vssue",prefix:"[Vssue]",admins:[],perPage:10,proxy:e=>"https://cors-anywhere.azm.workers.dev/"+e,issueContent:({url:e})=>e,autoCreateIssue:!1},e);const t=["api","owner","repo","clientId"];for(const e of t)this.options[e]||console.warn(`[Vssue] the option '${e}' is required`);if(this.options.locale)this.$i18n.locale=this.options.locale;else{const e=Object.keys(this.$i18n.messages),t=window.navigator.languages;this.$i18n.locale=t.filter(t=>e.includes(t)).shift()||"en"}}async init(){try{await this.initStore(),await this.initComments()}catch(e){e.response&&[401,403].includes(e.response.status)?this.isLoginRequired=!0:this.isFailed=!0,console.error(e)}}async initStore(){try{if(!this.options)throw new Error("Options are required to initialize Vssue");this.API=null,this.accessToken=null,this.user=null,this.issue=null,this.comments=null,this.query={page:1,perPage:this.options.perPage,sort:"desc"},this.isInitializing=!0,this.isIssueNotCreated=!1,this.isLoginRequired=!1,this.isFailed=!1,this.isCreatingIssue=!1,this.isLoadingComments=!1,this.isCreatingComment=!1,this.isUpdatingComment=!1;const e=this.options.api;this.API=new e({baseURL:this.options.baseURL,labels:this.options.labels,state:this.options.state,owner:this.options.owner,repo:this.options.repo,clientId:this.options.clientId,clientSecret:this.options.clientSecret,proxy:this.options.proxy}),await this.handleAuth()}finally{this.isInitializing=!1}}async initComments(){if(this.API&&this.options)if(this.issueId){const[e,t]=await Promise.all([this.API.getIssue({accessToken:this.accessToken,issueId:this.issueId}),this.API.getComments({accessToken:this.accessToken,issueId:this.issueId,query:this.query})]);this.issue=e,this.comments=t}else this.issue=await this.API.getIssue({accessToken:this.accessToken,issueTitle:this.issueTitle}),null===this.issue?(this.isIssueNotCreated=!0,this.options.autoCreateIssue&&await this.postIssue()):await this.getComments()}async postIssue(){if(this.API&&this.options&&!this.issue&&!this.issueId&&(this.isLogined||this.login(),this.isAdmin))try{this.isCreatingIssue=!0;const e=await this.API.postIssue({title:this.issueTitle,content:await this.options.issueContent({options:this.options,url:qn(window.location.href)}),accessToken:this.accessToken});this.issue=e,this.isIssueNotCreated=!1,await this.getComments()}catch(e){this.isFailed=!0}finally{this.isCreatingIssue=!1}}async getComments(){try{if(!this.API||!this.issue||this.isLoadingComments)return;this.isLoadingComments=!0;const e=await this.API.getComments({accessToken:this.accessToken,issueId:this.issue.id,query:this.query});return this.comments=e,this.query.page!==e.page&&(this.query.page=e.page),this.query.perPage!==e.perPage&&(this.query.perPage=e.perPage),e}catch(e){if(!e.response||![401,403].includes(e.response.status)||this.isLogined)throw this.$emit("error",e),e;this.isLoginRequired=!0}finally{this.isLoadingComments=!1}}async postComment({content:e}){try{if(!this.API||!this.issue||this.isCreatingComment)return;this.isCreatingComment=!0;return await this.API.postComment({accessToken:this.accessToken,content:e,issueId:this.issue.id})}catch(e){throw this.$emit("error",e),e}finally{this.isCreatingComment=!1}}async putComment({commentId:e,content:t}){try{if(!this.API||!this.issue)return;return await this.API.putComment({accessToken:this.accessToken,issueId:this.issue.id,commentId:e,content:t})}catch(e){throw this.$emit("error",e),e}}async deleteComment({commentId:e}){try{if(!this.API||!this.issue)return;return await this.API.deleteComment({accessToken:this.accessToken,issueId:this.issue.id,commentId:e})}catch(e){throw this.$emit("error",e),e}}async getCommentReactions({commentId:e}){try{if(!this.API||!this.issue)return;return await this.API.getCommentReactions({accessToken:this.accessToken,issueId:this.issue.id,commentId:e})}catch(e){throw this.$emit("error",e),e}}async postCommentReaction({commentId:e,reaction:t}){try{if(!this.API||!this.issue)return!1;return await this.API.postCommentReaction({accessToken:this.accessToken,issueId:this.issue.id,commentId:e,reaction:t})}catch(e){throw this.$emit("error",e),e}}login(){this.API&&this.API.redirectAuth()}logout(){this.setAccessToken(null),this.user=null}async handleAuth(){if(!this.API)return;const e=await this.API.handleAuth();e?(this.setAccessToken(e),this.user=await this.API.getUser({accessToken:e})):this.getAccessToken()?this.user=await this.API.getUser({accessToken:this.accessToken}):(this.setAccessToken(null),this.user=null)}getAccessToken(){return this.accessToken=window.localStorage.getItem(this.accessTokenKey),this.accessToken}setAccessToken(e){null===e?window.localStorage.removeItem(this.accessTokenKey):window.localStorage.setItem(this.accessTokenKey,e),this.accessToken=e}};Fr([Mn("query.perPage")],vo.prototype,"onQueryPerPageChange",null),Fr([Mn("query.page"),Mn("query.sort")],vo.prototype,"onQueryChange",null),vo=Fr([Object(On.b)({i18n:ho})],vo);var go=vo;let mo=class extends a.default{constructor(){super(...arguments),this.vssue=new go}onOptionsChange(e){this.vssue.setOptions(e)}mounted(){null!==this.title&&(this.vssue.title=this.title),null!==this.issueId&&(this.vssue.issueId=this.issueId),this.vssue.setOptions(this.options),this.vssue.init()}};var yo;Fr([In({type:[String,Function],required:!1,default:null})],mo.prototype,"title",void 0),Fr([In({type:[String,Number],required:!1,default:null})],mo.prototype,"issueId",void 0),Fr([In({type:Object,required:!1,default:()=>({})})],mo.prototype,"options",void 0),Fr([(yo="vssue",Object(On.a)((function(e,t){var n=e.provide;Pn(e),An(n)&&(n=e.provide=$n(n)),n.managed[t]=yo||t})))],mo.prototype,"vssue",void 0),Fr([Mn("options",{deep:!0})],mo.prototype,"onOptionsChange",null),mo=Fr([Object(On.b)({components:{Iconfont:Br,VssueBody:ao,VssueHeader:so}})],mo);const bo=Ur({render:function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"vssue"},[t("Iconfont"),this._v(" "),t("VssueHeader"),this._v(" "),t("VssueBody")],1)},staticRenderFns:[]},void 0,mo,void 0,!1,void 0,!1,void 0,void 0,void 0);var wo=n(25),xo=n.n(wo);function _o(e){return{username:e.login,avatar:e.avatar_url,homepage:e.html_url}}function ko(e){return{id:e.number,title:e.title,content:e.body,link:e.html_url}}function So(e){return{like:e["+1"],unlike:e[-1],heart:e.heart}}function Co(e){return{id:e.id,content:e.body_html,contentRaw:e.body,author:_o(e.user),createdAt:e.created_at,updatedAt:e.updated_at,reactions:So(e.reactions)}}function Oo(e){return"like"===e?"+1":"unlike"===e?"-1":e}class To{constructor({baseURL:e="https://github.com",owner:t,repo:n,labels:r,clientId:o,clientSecret:a,state:i,proxy:s}){if(void 0===a||void 0===s)throw new Error("clientSecret and proxy is required for GitHub V3");this.baseURL=e,this.owner=t,this.repo=n,this.labels=r,this.clientId=o,this.clientSecret=a,this.state=i,this.proxy=s,this.$http=xo.a.create({baseURL:"https://github.com"===e?"https://api.github.com":Fn(e,"api/v3"),headers:{Accept:"application/vnd.github.v3+json"}}),this.$http.interceptors.response.use(e=>e.data&&e.data.error?Promise.reject(new Error(e.data.error_description)):e,e=>(void 0===e.response&&"Network Error"===e.message&&(e.response={status:403}),Promise.reject(e)))}get platform(){return{name:"GitHub",link:this.baseURL,version:"v3",meta:{reactable:!0,sortable:!1}}}redirectAuth(){window.location.href=Nn(Fn(this.baseURL,"login/oauth/authorize"),{client_id:this.clientId,redirect_uri:window.location.href,scope:"public_repo",state:this.state})}async handleAuth(){const e=Vn(window.location.search);if(e.code){if(e.state!==this.state)return null;const t=e.code;delete e.code,delete e.state;const n=Nn(qn(window.location.href),e)+window.location.hash;window.history.replaceState(null,"",n);return await this.getAccessToken({code:t})}return null}async getAccessToken({code:e}){const t=Fn(this.baseURL,"login/oauth/access_token"),n="function"==typeof this.proxy?this.proxy(t):this.proxy,{data:r}=await this.$http.post(n,{client_id:this.clientId,client_secret:this.clientSecret,code:e},{headers:{Accept:"application/json"}});return r.access_token}async getUser({accessToken:e}){const{data:t}=await this.$http.get("user",{headers:{Authorization:"token "+e}});return _o(t)}async getIssue({accessToken:e,issueId:t,issueTitle:n}){const r={};if(e&&(r.headers={Authorization:"token "+e}),!t){r.params={q:[`"${n}"`,"is:issue","in:title",`repo:${this.owner}/${this.repo}`,"is:public",...this.labels.map(e=>"label:"+e)].join(" "),timestamp:Date.now()};const{data:e}=await this.$http.get("search/issues",r);return e.items.map(ko).find(e=>e.title===n)||null}try{r.params={timestamp:Date.now()};const{data:e}=await this.$http.get(`repos/${this.owner}/${this.repo}/issues/${t}`,r);return ko(e)}catch(e){if(e.response&&404===e.response.status)return null;throw e}}async postIssue({accessToken:e,title:t,content:n}){const{data:r}=await this.$http.post(`repos/${this.owner}/${this.repo}/issues`,{title:t,body:n,labels:this.labels},{headers:{Authorization:"token "+e}});return ko(r)}async getComments({accessToken:e,issueId:t,query:{page:n=1,perPage:r=10}={}}){const o={params:{timestamp:Date.now()}},a={params:{page:n,per_page:r,timestamp:Date.now()},headers:{Accept:["application/vnd.github.v3.raw+json","application/vnd.github.v3.html+json","application/vnd.github.squirrel-girl-preview"]}};e&&(o.headers={Authorization:"token "+e},a.headers.Authorization="token "+e);const[i,s]=await Promise.all([this.$http.get(`repos/${this.owner}/${this.repo}/issues/${t}`,o),this.$http.get(`repos/${this.owner}/${this.repo}/issues/${t}/comments`,a)]),l=s.headers.link||null,c=/rel="next"/.test(l)?Number(l.replace(/^.*[^_]page=(\d*).*rel="next".*$/,"$1"))-1:/rel="prev"/.test(l)?Number(l.replace(/^.*[^_]page=(\d*).*rel="prev".*$/,"$1"))+1:1,u=l?Number(l.replace(/^.*per_page=(\d*).*$/,"$1")):r;return{count:Number(i.data.comments),page:c,perPage:u,data:s.data.map(Co)}}async postComment({accessToken:e,issueId:t,content:n}){const{data:r}=await this.$http.post(`repos/${this.owner}/${this.repo}/issues/${t}/comments`,{body:n},{headers:{Authorization:"token "+e,Accept:["application/vnd.github.v3.raw+json","application/vnd.github.v3.html+json","application/vnd.github.squirrel-girl-preview"]}});return Co(r)}async putComment({accessToken:e,commentId:t,content:n}){const{data:r}=await this.$http.patch(`repos/${this.owner}/${this.repo}/issues/comments/${t}`,{body:n},{headers:{Authorization:"token "+e,Accept:["application/vnd.github.v3.raw+json","application/vnd.github.v3.html+json","application/vnd.github.squirrel-girl-preview"]}});return Co(r)}async deleteComment({accessToken:e,commentId:t}){const{status:n}=await this.$http.delete(`repos/${this.owner}/${this.repo}/issues/comments/${t}`,{headers:{Authorization:"token "+e}});return 204===n}async getCommentReactions({accessToken:e,commentId:t}){const{data:n}=await this.$http.get(`repos/${this.owner}/${this.repo}/issues/comments/${t}`,{params:{timestamp:Date.now()},headers:{Authorization:"token "+e,Accept:"application/vnd.github.squirrel-girl-preview"}});return So(n.reactions)}async postCommentReaction({accessToken:e,commentId:t,reaction:n}){const r=await this.$http.post(`repos/${this.owner}/${this.repo}/issues/comments/${t}/reactions`,{content:Oo(n)},{headers:{Authorization:"token "+e,Accept:"application/vnd.github.squirrel-girl-preview"}});return 200===r.status?this.deleteCommentReaction({accessToken:e,commentId:t,reactionId:r.data.id}):201===r.status}async deleteCommentReaction({accessToken:e,commentId:t,reactionId:n}){return 204===(await this.$http.delete(`repos/${this.owner}/${this.repo}/issues/comments/${t}/reactions/${n}`,{headers:{Authorization:"token "+e,Accept:"application/vnd.github.squirrel-girl-preview"}})).status}}function Ao(e){return null===e?{username:"ghost",avatar:"https://avatars3.githubusercontent.com/u/10137?v=4",homepage:"https://github.com/ghost"}:{username:e.login,avatar:e.avatarUrl,homepage:e.url}}function $o(e){return{id:e.number,title:e.title,content:e.body,link:e.url}}function jo(e){return{like:e.find(e=>"THUMBS_UP"===e.content).users.totalCount,unlike:e.find(e=>"THUMBS_DOWN"===e.content).users.totalCount,heart:e.find(e=>"HEART"===e.content).users.totalCount}}function Po(e){return{id:e.id,content:e.bodyHTML,contentRaw:e.body,author:Ao(e.author),createdAt:e.createdAt,updatedAt:e.updatedAt,reactions:jo(e.reactionGroups)}}function Eo(e){return"like"===e?"THUMBS_UP":"unlike"===e?"THUMBS_DOWN":"heart"===e?"HEART":e}class Lo{constructor({baseURL:e="https://github.com",owner:t,repo:n,labels:r,clientId:o,clientSecret:a,state:i,proxy:s}){if(void 0===a||void 0===s)throw new Error("clientSecret and proxy is required for GitHub V4");this.baseURL=e,this.owner=t,this.repo=n,this.labels=r,this.clientId=o,this.clientSecret=a,this.state=i,this.proxy=s,this._pageInfo={page:1,startCursor:null,endCursor:null,sort:null,perPage:null},this._issueNodeId=null,this.$http=xo.a.create({baseURL:"https://github.com"===e?"https://api.github.com":Fn(e,"api"),headers:{Accept:"application/vnd.github.v3+json"}}),this.$http.interceptors.response.use(e=>e.data.error?Promise.reject(e.data.error_description):e.data.errors?Promise.reject(e.data.errors[0].message):e)}get platform(){return{name:"GitHub",link:this.baseURL,version:"v4",meta:{reactable:!0,sortable:!0}}}redirectAuth(){window.location.href=Nn(Fn(this.baseURL,"login/oauth/authorize"),{client_id:this.clientId,redirect_uri:window.location.href,scope:"public_repo",state:this.state})}async handleAuth(){const e=Vn(window.location.search);if(e.code){if(e.state!==this.state)return null;const t=e.code;delete e.code,delete e.state;const n=Nn(qn(window.location.href),e)+window.location.hash;window.history.replaceState(null,"",n);return await this.getAccessToken({code:t})}return null}async getAccessToken({code:e}){const t=Fn(this.baseURL,"login/oauth/access_token"),n="function"==typeof this.proxy?this.proxy(t):this.proxy,{data:r}=await this.$http.post(n,{client_id:this.clientId,client_secret:this.clientSecret,code:e},{headers:{Accept:"application/json"}});return r.access_token}async getUser({accessToken:e}){const{data:t}=await this.$http.post("graphql",{query:"query getUser {\n viewer {\n login\n avatarUrl\n url\n }\n}"},{headers:{Authorization:"token "+e}});return Ao(t.data.viewer)}async getIssue({accessToken:e,issueId:t,issueTitle:n}){const r={};if(e&&(r.headers={Authorization:"token "+e}),!t){const e=[`"${n}"`,"in:title",`repo:${this.owner}/${this.repo}`,"is:public",...this.labels.map(e=>"label:"+e)].join(" "),{data:t}=await this.$http.post("graphql",{variables:{query:e},query:"query getIssueByTitle(\n $query: String!\n) {\n search(\n query: $query\n type: ISSUE\n first: 20\n ) {\n nodes {\n ... on Issue {\n id\n number\n title\n body\n url\n }\n }\n }\n}"},r),o=t.data.search.nodes.find(e=>e.title===n);return o?(this._issueNodeId=o.id,$o(o)):null}try{const{data:e}=await this.$http.post("graphql",{query:`query getIssueById {\n repository(owner: "${this.owner}", name: "${this.repo}") {\n issue (number: ${t}) {\n id\n number\n title\n body\n url\n }\n }\n}`},r);return this._issueNodeId=e.data.repository.issue.id,$o(e.data.repository.issue)}catch(e){if(e.response&&404===e.response.status)return null;throw e}}async postIssue({accessToken:e,title:t,content:n}){const{data:r}=await this.$http.post(`repos/${this.owner}/${this.repo}/issues`,{title:t,body:n,labels:this.labels},{headers:{Authorization:"token "+e}});return r.url=r.html_url,this._issueNodeId=r.node_id,$o(r)}async getComments({accessToken:e,issueId:t,query:{page:n=1,perPage:r=10,sort:o="desc"}={}}){const a={};e&&(a.headers={Authorization:"token "+e}),null!==this._pageInfo.sort&&o!==this._pageInfo.sort&&(n=1);const{firstOrLast:i,afterOrBefore:s,cursor:l}=this._getQueryParams({page:n,sort:o}),{data:c}=await this.$http.post("graphql",{variables:{owner:this.owner,repo:this.repo,issueId:t,perPage:r},query:`query getComments(\n $owner: String!\n $repo: String!\n $issueId: Int!\n $perPage: Int!\n) {\n repository(owner: $owner, name: $repo) {\n issue(number: $issueId) {\n comments(\n ${i}: $perPage\n ${null===s?"":`${s}: "${l}"`}\n ) {\n totalCount\n pageInfo {\n endCursor\n startCursor\n }\n nodes {\n id\n body\n bodyHTML\n createdAt\n updatedAt\n author {\n avatarUrl\n login\n url\n }\n reactionGroups {\n users (first: 0) {\n totalCount\n }\n content\n }\n }\n }\n }\n }\n}`},a),u=c.data.repository.issue.comments;return"desc"===o&&u.nodes.reverse(),this._pageInfo={page:n,startCursor:u.pageInfo.startCursor,endCursor:u.pageInfo.endCursor,sort:o,perPage:r},{count:u.totalCount,page:n,perPage:r,data:u.nodes.map(Po)}}async postComment({accessToken:e,content:t}){const{data:n}=await this.$http.post("graphql",{variables:{issueNodeId:this._issueNodeId,content:t},query:"mutation postComment(\n $issueNodeId: ID!\n $content: String!\n) {\n addComment(\n input: {\n subjectId: $issueNodeId\n body: $content\n }\n ) {\n commentEdge {\n node {\n id\n body\n bodyHTML\n createdAt\n updatedAt\n author {\n avatarUrl\n login\n url\n }\n reactionGroups {\n users (first: 0) {\n totalCount\n }\n content\n }\n }\n }\n }\n}"},{headers:{Authorization:"token "+e}});return Po(n.data.addComment.commentEdge.node)}async putComment({accessToken:e,commentId:t,content:n}){const{data:r}=await this.$http.post("graphql",{variables:{commentId:t,content:n},query:"mutation putComment(\n $commentId: ID!,\n $content: String!,\n) {\n updateIssueComment(input: {\n id: $commentId\n body: $content\n }) {\n issueComment {\n id\n body\n bodyHTML\n createdAt\n updatedAt\n author {\n avatarUrl\n login\n url\n }\n reactionGroups {\n users (first: 0) {\n totalCount\n }\n content\n }\n }\n }\n}"},{headers:{Authorization:"token "+e}});return Po(r.data.updateIssueComment.issueComment)}async deleteComment({accessToken:e,commentId:t}){return await this.$http.post("graphql",{variables:{commentId:t},query:"mutation deleteComment(\n $commentId: ID!,\n) {\n deleteIssueComment(input: {\n id: $commentId\n }) {\n clientMutationId\n }\n}"},{headers:{Authorization:"token "+e}}),!0}async getCommentReactions({accessToken:e,issueId:t,commentId:n}){const{firstOrLast:r,afterOrBefore:o,cursor:a}=this._getQueryParams(),{data:i}=await this.$http.post("graphql",{variables:{owner:this.owner,repo:this.repo,issueId:t,perPage:this._pageInfo.perPage},query:`query getComments(\n $owner: String!\n $repo: String!\n $issueId: Int!\n $perPage: Int!\n) {\n repository(owner: $owner, name: $repo) {\n issue(number: $issueId) {\n comments(\n ${r}: $perPage\n ${null===o?"":`${o}: "${a}"`}\n ) {\n nodes {\n id\n reactionGroups {\n users (first: 0) {\n totalCount\n }\n content\n }\n }\n }\n }\n }\n}`},{headers:{Authorization:"token "+e}});return jo(i.data.repository.issue.comments.nodes.find(e=>e.id===n).reactionGroups)}async postCommentReaction({accessToken:e,commentId:t,reaction:n}){return await this.$http.post("graphql",{variables:{commentId:t,content:Eo(n)},query:"mutation postCommentReaction(\n $commentId: ID!,\n $content: ReactionContent!,\n) {\n addReaction(input: {\n subjectId: $commentId\n content: $content\n }) {\n reaction {\n databaseId\n }\n }\n}"},{headers:{Authorization:"token "+e}}),!0}_getQueryParams({page:e=this._pageInfo.page,sort:t=this._pageInfo.sort}={}){let n,r,o;return 1===e?(n="asc"===t?"first":"last",r=null,o=null):"asc"===t?e>this._pageInfo.page?(n="first",r="after",o=this._pageInfo.endCursor):(n="last",r="before",o=this._pageInfo.startCursor):e>this._pageInfo.page?(n="last",r="before",o=this._pageInfo.startCursor):(n="first",r="after",o=this._pageInfo.endCursor),{firstOrLast:n,afterOrBefore:r,cursor:o}}}function Io(e){return{username:e.username,avatar:e.avatar_url,homepage:e.web_url}}function Mo(e){return{id:e.iid,title:e.title,content:e.description,link:e.web_url}}function Ro(e){return{id:e.id,content:e.body_html||"",contentRaw:e.body,author:Io(e.author),createdAt:e.created_at,updatedAt:e.updated_at,reactions:e.reactions}}function Do(e){return{like:e.filter(e=>"thumbsup"===e.name).length,unlike:e.filter(e=>"thumbsdown"===e.name).length,heart:e.filter(e=>"heart"===e.name).length}}function No(e){return"like"===e?"thumbsup":"unlike"===e?"thumbsdown":e}class Fo{constructor({baseURL:e="https://gitlab.com",owner:t,repo:n,labels:r,clientId:o,state:a}){this.baseURL=e,this.owner=t,this.repo=n,this.labels=r,this.clientId=o,this.state=a,this._encodedRepo=encodeURIComponent(`${this.owner}/${this.repo}`),this.$http=xo.a.create({baseURL:Fn(e,"api/v4"),headers:{Accept:"application/json"}})}get platform(){return{name:"GitLab",link:this.baseURL,version:"v4",meta:{reactable:!0,sortable:!0}}}redirectAuth(){window.location.href=Nn(Fn(this.baseURL,"oauth/authorize"),{client_id:this.clientId,redirect_uri:window.location.href,response_type:"token",state:this.state})}async handleAuth(){const e=Vn(window.location.hash.slice(1));if(!e.access_token||e.state!==this.state)return null;const t=e.access_token;delete e.access_token,delete e.token_type,delete e.expires_in,delete e.state;const n=Dn(e),r=n?"#"+n:"",o=`${qn(window.location.href)}${window.location.search}${r}`;return window.history.replaceState(null,"",o),t}async getUser({accessToken:e}){const{data:t}=await this.$http.get("user",{headers:{Authorization:"Bearer "+e}});return Io(t)}async getIssue({accessToken:e,issueId:t,issueTitle:n}){const r={};if(e&&(r.headers={Authorization:"Bearer "+e}),!t){r.params={labels:this.labels.join(","),order_by:"created_at",sort:"asc",search:n};const{data:e}=await this.$http.get(`projects/${this._encodedRepo}/issues`,r);return e.map(Mo).find(e=>e.title===n)||null}try{const{data:e}=await this.$http.get(`projects/${this._encodedRepo}/issues/${t}`,r);return Mo(e)}catch(e){if(e.response&&404===e.response.status)return null;throw e}}async postIssue({accessToken:e,title:t,content:n}){const{data:r}=await this.$http.post(`projects/${this._encodedRepo}/issues`,{title:t,description:n,labels:this.labels.join(",")},{headers:{Authorization:"Bearer "+e}});return Mo(r)}async getComments({accessToken:e,issueId:t,query:{page:n=1,perPage:r=10,sort:o="desc"}={}}){const a={params:{page:n,per_page:r,order_by:"created_at",sort:o}};e&&(a.headers={Authorization:"Bearer "+e});const i=await this.$http.get(`projects/${this._encodedRepo}/issues/${t}/notes`,a),s=i.data,l=[];for(const n of s)l.push((async()=>{n.body_html=await this.getMarkdownContent({accessToken:e,contentRaw:n.body})})()),l.push((async()=>{n.reactions=await this.getCommentReactions({accessToken:e,issueId:t,commentId:n.id})})());return await Promise.all(l),{count:Number(i.headers["x-total"]),page:Number(i.headers["x-page"]),perPage:Number(i.headers["x-per-page"]),data:s.map(Ro)}}async postComment({accessToken:e,issueId:t,content:n}){const{data:r}=await this.$http.post(`projects/${this._encodedRepo}/issues/${t}/notes`,{body:n},{headers:{Authorization:"Bearer "+e}});return Ro(r)}async putComment({accessToken:e,issueId:t,commentId:n,content:r}){const{data:o}=await this.$http.put(`projects/${this._encodedRepo}/issues/${t}/notes/${n}`,{body:r},{headers:{Authorization:"Bearer "+e}}),[a,i]=await Promise.all([this.getMarkdownContent({accessToken:e,contentRaw:o.body}),this.getCommentReactions({accessToken:e,issueId:t,commentId:o.id})]);return o.body_html=a,o.reactions=i,Ro(o)}async deleteComment({accessToken:e,issueId:t,commentId:n}){const{status:r}=await this.$http.delete(`projects/${this._encodedRepo}/issues/${t}/notes/${n}`,{headers:{Authorization:"Bearer "+e}});return 204===r}async getCommentReactions({accessToken:e,issueId:t,commentId:n}){const{data:r}=await this.$http.get(`projects/${this._encodedRepo}/issues/${t}/notes/${n}/award_emoji`,{headers:{Authorization:"Bearer "+e}});return Do(r)}async postCommentReaction({issueId:e,commentId:t,reaction:n,accessToken:r}){try{return 201===(await this.$http.post(`projects/${this._encodedRepo}/issues/${e}/notes/${t}/award_emoji`,{name:No(n)},{headers:{Authorization:"Bearer "+r}})).status}catch(e){if(e.response&&404===e.response.status)return!1;throw e}}async getMarkdownContent({accessToken:e,contentRaw:t}){const n={};e&&(n.headers={Authorization:"Bearer "+e});const{data:r}=await this.$http.post("markdown",{text:t,gfm:!0},n);return r.html}}function zo(e){return{username:e.nickname,avatar:e.links.avatar.href,homepage:e.links.html.href}}function Uo(e){return{id:e.id,title:e.title,content:e.content.raw,link:e.links.html.href}}function Bo(e){return{id:e.id,content:e.content.html,contentRaw:e.content.raw,author:zo(e.user),createdAt:e.created_on,updatedAt:e.updated_on,reactions:null}}class qo{constructor({baseURL:e="https://bitbucket.org",owner:t,repo:n,clientId:r,state:o}){this.baseURL=e,this.owner=t,this.repo=n,this.clientId=r,this.state=o,this.$http=xo.a.create({baseURL:"https://api.bitbucket.org/2.0",headers:{Accept:"application/json"}})}get platform(){return{name:"Bitbucket",link:this.baseURL,version:"v2",meta:{reactable:!1,sortable:!0}}}redirectAuth(){window.location.href=Nn(Fn(this.baseURL,"site/oauth2/authorize"),{client_id:this.clientId,redirect_uri:window.location.href,response_type:"token",state:this.state})}async handleAuth(){const e=Vn(window.location.hash.slice(1));if(!e.access_token||e.state!==this.state)return null;const t=e.access_token;delete e.access_token,delete e.token_type,delete e.expires_in,delete e.state,delete e.scopes;const n=Dn(e),r=n?"#"+n:"",o=`${qn(window.location.href)}${window.location.search}${r}`;return window.history.replaceState(null,"",o),t}async getUser({accessToken:e}){const{data:t}=await this.$http.get("user",{headers:{Authorization:"Bearer "+e}});return zo(t)}async getIssue({accessToken:e,issueId:t,issueTitle:n}){const r={};if(e&&(r.headers={Authorization:"Bearer "+e}),!t){r.params={sort:"created_on",q:`title="${n}"`,timestamp:Date.now()};const{data:e}=await this.$http.get(`repositories/${this.owner}/${this.repo}/issues`,r);return e.size>0?Uo(e.values[0]):null}try{r.params={timestamp:Date.now()};const{data:e}=await this.$http.get(`repositories/${this.owner}/${this.repo}/issues/${t}`,r);return Uo(e)}catch(e){if(e.response&&404===e.response.status)return null;throw e}}async postIssue({accessToken:e,title:t,content:n}){const{data:r}=await this.$http.post(`repositories/${this.owner}/${this.repo}/issues`,{title:t,content:{raw:n},priority:"trivial",kind:"task"},{headers:{Authorization:"Bearer "+e}});return r.links.html={href:Fn(this.baseURL,`${this.owner}/${this.repo}/issues/${r.id}`)},Uo(r)}async getComments({accessToken:e,issueId:t,query:{page:n=1,perPage:r=10,sort:o="desc"}={}}){const a={params:{page:n,pagelen:r,sort:"desc"===o?"-created_on":"created_on",timestamp:Date.now()}};e&&(a.headers={Authorization:"Bearer "+e});const{data:i}=await this.$http.get(`repositories/${this.owner}/${this.repo}/issues/${t}/comments`,a);return{count:i.size,page:i.page,perPage:i.pagelen,data:i.values.filter(e=>null!==e.content.raw).map(Bo)}}async postComment({accessToken:e,issueId:t,content:n}){const{data:r}=await this.$http.post(`repositories/${this.owner}/${this.repo}/issues/${t}/comments`,{content:{raw:n}},{headers:{Authorization:"Bearer "+e}});return Bo(r)}async putComment({accessToken:e,issueId:t,commentId:n,content:r}){const{data:o}=await this.$http.put(`repositories/${this.owner}/${this.repo}/issues/${t}/comments/${n}`,{content:{raw:r}},{headers:{Authorization:"Bearer "+e}});return Bo(o)}async deleteComment({accessToken:e,issueId:t,commentId:n}){const{status:r}=await this.$http.delete(`repositories/${this.owner}/${this.repo}/issues/${t}/comments/${n}`,{headers:{Authorization:"Bearer "+e}});return 204===r}async getCommentReactions(e){throw new Error("501 Not Implemented")}async postCommentReaction(e){throw new Error("501 Not Implemented")}}function Vo(e){return{username:e.login,avatar:e.avatar_url,homepage:e.html_url}}function Ho(e){return{id:e.number,title:e.title,content:e.body,link:e.html_url}}function Qo(e){return{id:e.id,content:e.body_html||"",contentRaw:e.body,author:Vo(e.user),createdAt:e.created_at,updatedAt:e.updated_at||"",reactions:null}}class Wo{constructor({baseURL:e="https://gitee.com",owner:t,repo:n,labels:r,clientId:o,clientSecret:a,state:i,proxy:s}){if(void 0===a||void 0===s)throw new Error("clientSecret and proxy is required for Gitee V5");this.baseURL=e,this.owner=t,this.repo=n,this.labels=r,this.clientId=o,this.clientSecret=a,this.state=i,this.proxy=s,this.$http=xo.a.create({baseURL:Fn(e,"api/v5")}),this.$http.interceptors.response.use(e=>e,e=>(e.response.data&&e.response.data.message&&(e.message=e.response.data.message),Promise.reject(e)))}get platform(){return{name:"Gitee",link:this.baseURL,version:"v5",meta:{reactable:!1,sortable:!1}}}redirectAuth(){window.location.href=Nn(Fn(this.baseURL,"oauth/authorize"),{client_id:this.clientId,redirect_uri:window.location.href,scope:"user_info issues notes",response_type:"code",state:this.state})}async handleAuth(){const e=Vn(window.location.search);if(e.code){if(e.state!==this.state)return null;const t=e.code;delete e.code,delete e.state;const n=Nn(qn(window.location.href),e)+window.location.hash;window.history.replaceState(null,"",n);return await this.getAccessToken({code:t})}return null}async getAccessToken({code:e}){const t=Fn(this.baseURL,"oauth/token"),n="function"==typeof this.proxy?this.proxy(t):this.proxy,{data:r}=await this.$http.post(n,{client_id:this.clientId,client_secret:this.clientSecret,code:e,grant_type:"authorization_code",redirect_uri:window.location.href});return r.access_token}async getUser({accessToken:e}){const{data:t}=await this.$http.get("user",{params:{access_token:e}});return Vo(t)}async getIssue({accessToken:e,issueId:t,issueTitle:n}){const r={params:{timestamp:Date.now()}};if(e&&(r.params.access_token=e),!t){Object.assign(r.params,{q:n,repo:`${this.owner}/${this.repo}`,per_page:1});const{data:e}=await this.$http.get("search/issues",r);return e.map(Ho).find(e=>e.title===n)||null}try{const{data:e}=await this.$http.get(`repos/${this.owner}/${this.repo}/issues/${t}`,r);return Ho(e)}catch(e){if(e.response&&404===e.response.status)return null;throw e}}async postIssue({accessToken:e,title:t,content:n}){const{data:r}=await this.$http.post(`repos/${this.owner}/issues`,{access_token:e,repo:this.repo,title:t,body:n,labels:this.labels.join(",")});return Ho(r)}async getComments({accessToken:e,issueId:t,query:{page:n=1,perPage:r=10}={}}){const o={params:{page:n,per_page:r,timestamp:Date.now()},headers:{Accept:["application/vnd.gitee.html+json"]}};e&&(o.params.access_token=e);const a=await this.$http.get(`repos/${this.owner}/${this.repo}/issues/${t}/comments`,o);return{count:Number(a.headers.total_count),page:n,perPage:r,data:a.data.map(Qo)}}async postComment({accessToken:e,issueId:t,content:n}){const{data:r}=await this.$http.post(`repos/${this.owner}/${this.repo}/issues/${t}/comments`,{body:n,access_token:e},{headers:{Accept:["application/vnd.gitee.html+json"]}});return Qo(r)}async putComment({accessToken:e,commentId:t,content:n}){const{data:r}=await this.$http.patch(`repos/${this.owner}/${this.repo}/issues/comments/${t}`,{body:n,access_token:e},{headers:{Accept:["application/vnd.gitee.html+json"]}});return Qo(r)}async deleteComment({accessToken:e,commentId:t}){const{status:n}=await this.$http.delete(`repos/${this.owner}/${this.repo}/issues/comments/${t}`,{params:{access_token:e}});return 204===n}async getCommentReactions(e){throw new Error("501 Not Implemented")}async postCommentReaction(e){throw new Error("501 Not Implemented")}}n(428);var Jo={name:"Vssue",components:{VssueComponent:bo},props:{options:{type:Object,default:function(){return{}}}},data:function(){return{key:"key",platformOptions:{github:To,"github-v4":Lo,gitlab:Fo,bitbucket:qo,gitee:Wo}}},computed:{vssueOptions:function(){var e=this.platformOptions,t=this.options,n=e[t.platform];return Object(Ht.a)(Object(Ht.a)({},t),{},{api:n})}},watch:{$route:function(e,t){var n=this;e.path!==t.path&&setTimeout((function(){n.key="reco-".concat((new Date).getTime())}),300)}}},Ko=(n(429),{components:{Valine:Cn,Vssue:Object(Wt.a)(Jo,(function(){var e=this.$createElement;return(this._self._c||e)("VssueComponent",{key:this.key,staticClass:"vssue-wrapper",attrs:{options:this.vssueOptions}})}),[],!1,null,null,null).exports},props:{isShowComments:{type:Boolean,default:!0}},data:function(){return{commentsOptions:{}}},computed:{solution:function(){var e=this.commentsOptions.solution,t=this.$themeConfig,n=t.valineConfig,r=t.vssueConfig,o=this.$themeLocaleConfig,a=o.valineConfig,i=o.vssueConfig,s="";return void 0!==e?s=e:void 0!==a||void 0!==n?s="valine":void 0===i&&void 0===r||(s="vssue"),s},options:function(){var e=this.commentsOptions.options,t=this.$themeConfig,n=t.valineConfig,r=t.vssueConfig,o=this.$themeLocaleConfig,a=o.valineConfig,i=o.vssueConfig;return void 0!==e?e:void 0!==a||void 0!==n?a||n:void 0!==i||void 0!==r?i||r:null},componentName:function(){var e=this.solution;return"valine"===e?"Valine":"vssue"===e?"Vssue":""}},mounted:function(){this.$themeConfig.commentsSolution=this.solution}}),Go=Object(Wt.a)(Ko,(function(){var e=this.$createElement,t=this._self._c||e;return t("div",{directives:[{name:"show",rawName:"v-show",value:this.isShowComments,expression:"isShowComments"}],staticClass:"comments-wrapper"},[t("ClientOnly",[t(this.componentName,{tag:"component",attrs:{options:this.options}})],1)],1)}),[],!1,null,null,null).exports,Yo={props:{idVal:String,numStyle:Object,flagTitle:{type:String,default:"Your Article Title"}},methods:{getIdVal:function(e){var t=this.$site.base;return t.slice(0,t.length-1)+e}}},Xo=Object(Wt.a)(Yo,(function(){var e=this.$createElement,t=this._self._c||e;return t("span",{staticClass:"leancloud-visitors",attrs:{id:this.getIdVal(this.idVal),"data-flag-title":this.flagTitle}},[t("a",{staticClass:"leancloud-visitors-count",style:this.numStyle})])}),[],!1,null,null,null).exports,Zo=(n(430),n(69)),ea=n(20),ta=n(30),na={tags:{"树":{key:"树",scope:"tags",path:"/tag/树/",pageKeys:["v-596412a3"]},Oracle:{key:"Oracle",scope:"tags",path:"/tag/Oracle/",pageKeys:["v-65a6bb79","v-6e62fcdc","v-573687b9"]},PostgreSQL:{key:"PostgreSQL",scope:"tags",path:"/tag/PostgreSQL/",pageKeys:["v-6e62fcdc","v-6ff39fcd"]},MySQL:{key:"MySQL",scope:"tags",path:"/tag/MySQL/",pageKeys:["v-6e62fcdc","v-9c213422","v-573687b9","v-32f558ef"]},H2:{key:"H2",scope:"tags",path:"/tag/H2/",pageKeys:["v-6e62fcdc"]},Ansible:{key:"Ansible",scope:"tags",path:"/tag/Ansible/",pageKeys:["v-e67597a2"]},Docker:{key:"Docker",scope:"tags",path:"/tag/Docker/",pageKeys:["v-51483fa7","v-795d1e6f","v-769e1d81","v-573687b9"]},SQL:{key:"SQL",scope:"tags",path:"/tag/SQL/",pageKeys:["v-7022cea2"]},ShardingSphere:{key:"ShardingSphere",scope:"tags",path:"/tag/ShardingSphere/",pageKeys:["v-af3283e2"]},BAT:{key:"BAT",scope:"tags",path:"/tag/BAT/",pageKeys:["v-23544f2f"]},Shell:{key:"Shell",scope:"tags",path:"/tag/Shell/",pageKeys:["v-23544f2f","v-7d944daf","v-216f4f6f"]},Nginx:{key:"Nginx",scope:"tags",path:"/tag/Nginx/",pageKeys:["v-795d1e6f","v-573687b9","v-32f558ef","v-0f7abfe2"]},Redis:{key:"Redis",scope:"tags",path:"/tag/Redis/",pageKeys:["v-573687b9","v-32f558ef","v-7407ac37","v-2c088596"]},ElasticSearch:{key:"ElasticSearch",scope:"tags",path:"/tag/ElasticSearch/",pageKeys:["v-573687b9"]},FastDFS:{key:"FastDFS",scope:"tags",path:"/tag/FastDFS/",pageKeys:["v-573687b9"]},Naco:{key:"Naco",scope:"tags",path:"/tag/Naco/",pageKeys:["v-573687b9"]},GitLab:{key:"GitLab",scope:"tags",path:"/tag/GitLab/",pageKeys:["v-73606efa"]},Git:{key:"Git",scope:"tags",path:"/tag/Git/",pageKeys:["v-58dfedef"]},Gradle:{key:"Gradle",scope:"tags",path:"/tag/Gradle/",pageKeys:["v-1876b22a"]},IDEA:{key:"IDEA",scope:"tags",path:"/tag/IDEA/",pageKeys:["v-365942ea"]},Java:{key:"Java",scope:"tags",path:"/tag/Java/",pageKeys:["v-a7177b82","v-e8b873a2","v-13441367","v-38951577","v-cfee443a","v-ba305d7e","v-6c01f487","v-5f47816f","v-236e4b6f","v-405ccd6f","v-bd6f557a"]},Jenkins:{key:"Jenkins",scope:"tags",path:"/tag/Jenkins/",pageKeys:["v-ad850a22"]},Maven:{key:"Maven",scope:"tags",path:"/tag/Maven/",pageKeys:["v-994a2be2","v-f06bc1e2"]},K8S:{key:"K8S",scope:"tags",path:"/tag/K8S/",pageKeys:["v-40365722"]},Linux:{key:"Linux",scope:"tags",path:"/tag/Linux/",pageKeys:["v-32f558ef","v-ace41292","v-c26696ae","v-65d68009","v-74987d65","v-e7ff6efe","v-7c323989","v-4cbd3a29","v-c6899e26","v-6d2742e9","v-7ab54286","v-65a04ebc","v-4f836b11"]},Tomcat:{key:"Tomcat",scope:"tags",path:"/tag/Tomcat/",pageKeys:["v-32f558ef","v-6024e91e"]},"Node.js":{key:"Node.js",scope:"tags",path:"/tag/Node.js/",pageKeys:["v-11663be3"]},npm:{key:"npm",scope:"tags",path:"/tag/npm/",pageKeys:["v-11663be3"]},Sonar:{key:"Sonar",scope:"tags",path:"/tag/Sonar/",pageKeys:["v-5667600f"]},SonarQube:{key:"SonarQube",scope:"tags",path:"/tag/SonarQube/",pageKeys:["v-5667600f"]},JDK:{key:"JDK",scope:"tags",path:"/tag/JDK/",pageKeys:["v-236e4b6f"]},Mybatis:{key:"Mybatis",scope:"tags",path:"/tag/Mybatis/",pageKeys:["v-6a42fdbc"]},ActiveMQ:{key:"ActiveMQ",scope:"tags",path:"/tag/ActiveMQ/",pageKeys:["v-3d63be0f"]},Apache:{key:"Apache",scope:"tags",path:"/tag/Apache/",pageKeys:["v-ffcfe472"]},RabbitMQ:{key:"RabbitMQ",scope:"tags",path:"/tag/RabbitMQ/",pageKeys:["v-ffed75a2","v-5f2c0232"]},VMware:{key:"VMware",scope:"tags",path:"/tag/VMware/",pageKeys:["v-65a04ebc"]},centos:{key:"centos",scope:"tags",path:"/tag/centos/",pageKeys:["v-65a04ebc"]},ubuntu:{key:"ubuntu",scope:"tags",path:"/tag/ubuntu/",pageKeys:["v-65a04ebc"]},zookeeper:{key:"zookeeper",scope:"tags",path:"/tag/zookeeper/",pageKeys:["v-22eef1cf"]},Python:{key:"Python",scope:"tags",path:"/tag/Python/",pageKeys:["v-657fc160","v-473c041a"]},pytest:{key:"pytest",scope:"tags",path:"/tag/pytest/",pageKeys:["v-473c041a"]},selenium:{key:"selenium",scope:"tags",path:"/tag/selenium/",pageKeys:["v-473c041a"]},"自动化测试":{key:"自动化测试",scope:"tags",path:"/tag/自动化测试/",pageKeys:["v-473c041a","v-45a79697","v-c30d6fd6"]},"接口测试":{key:"接口测试",scope:"tags",path:"/tag/接口测试/",pageKeys:["v-d87f35e2"]},"单元测试":{key:"单元测试",scope:"tags",path:"/tag/单元测试/",pageKeys:["v-b18a22e2"]},JUnit:{key:"JUnit",scope:"tags",path:"/tag/JUnit/",pageKeys:["v-b18a22e2"]},Mockito:{key:"Mockito",scope:"tags",path:"/tag/Mockito/",pageKeys:["v-b18a22e2"]},PowerMock:{key:"PowerMock",scope:"tags",path:"/tag/PowerMock/",pageKeys:["v-b18a22e2"]},Spring:{key:"Spring",scope:"tags",path:"/tag/Spring/",pageKeys:["v-b18a22e2"]}},categories:{"数据结构":{key:"数据结构",scope:"categories",path:"/categories/数据结构/",pageKeys:["v-596412a3","v-147c91e8"]},"数据库":{key:"数据库",scope:"categories",path:"/categories/数据库/",pageKeys:["v-65a6bb79","v-6e62fcdc","v-9c213422","v-6ff39fcd","v-7022cea2"]},DevOps:{key:"DevOps",scope:"categories",path:"/categories/DevOps/",pageKeys:["v-e67597a2","v-51483fa7","v-795d1e6f","v-769e1d81","v-573687b9","v-73606efa","v-58dfedef","v-1876b22a","v-365942ea","v-ad850a22","v-994a2be2","v-40365722","v-32f558ef","v-f06bc1e2","v-7d944daf","v-216f4f6f","v-11663be3","v-6024e91e","v-35439c93","v-9843a6b6","v-5667600f","v-8bb6c1e2"]},"编程语言":{key:"编程语言",scope:"categories",path:"/categories/编程语言/",pageKeys:["v-a7177b82","v-e8b873a2","v-13441367","v-38951577","v-cfee443a","v-ba305d7e","v-6c01f487","v-5f47816f","v-236e4b6f","v-405ccd6f","v-bd6f557a","v-657fc160"]},"前端开发":{key:"前端开发",scope:"categories",path:"/categories/前端开发/",pageKeys:["v-775fb0fc","v-c142182e","v-d8759ade"]},"操作系统":{key:"操作系统",scope:"categories",path:"/categories/操作系统/",pageKeys:["v-ace41292","v-c26696ae","v-65d68009","v-74987d65","v-e7ff6efe","v-7c323989","v-4cbd3a29","v-c6899e26","v-6d2742e9","v-7ab54286","v-65a04ebc","v-4f836b11"]},"中间件":{key:"中间件",scope:"categories",path:"/categories/中间件/",pageKeys:["v-3d63be0f","v-ffcfe472","v-ffed75a2","v-0f7abfe2","v-5f2c0232","v-7407ac37","v-2c088596","v-22eef1cf"]},Spring:{key:"Spring",scope:"categories",path:"/categories/Spring/",pageKeys:["v-2ea49e47"]},"测试框架":{key:"测试框架",scope:"categories",path:"/categories/测试框架/",pageKeys:["v-473c041a","v-d87f35e2","v-45a79697","v-b18a22e2","v-c30d6fd6"]},"计算机术语":{key:"计算机术语",scope:"categories",path:"/categories/计算机术语/",pageKeys:["v-3d0a2735","v-b5c38f26"]},"Mail server":{key:"Mail server",scope:"categories",path:"/categories/Mail server/",pageKeys:["v-000728af"]}},timeline:{}},ra=function(){function e(t,n){var r=this;Object(ea.a)(this,e),this._metaMap=Object.assign({},t),Object.keys(this._metaMap).forEach((function(e){var t=r._metaMap[e].pageKeys;r._metaMap[e].pages=t.map((function(e){return function(e,t){for(var n=0;n0?-1:1},categories:function(e,t){var r=n(229);return r(e.frontmatter.date)-r(t.frontmatter.date)>0?-1:1}}),aa={tags:function(e,t,n){var r=t;return["tags"].some((function(t){var n=e.frontmatter[t];return Array.isArray(n)?n.some((function(e){return e===r})):n===r}))},categories:function(e,t,n){var r=t;return["categories"].some((function(t){var n=e.frontmatter[t];return Array.isArray(n)?n.some((function(e){return e===r})):n===r}))}},ia=[{pid:"tags",id:"树",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/树/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Oracle",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Oracle/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"PostgreSQL",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/PostgreSQL/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"MySQL",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/MySQL/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"H2",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/H2/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Ansible",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Ansible/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Docker",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Docker/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"SQL",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/SQL/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"ShardingSphere",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/ShardingSphere/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"BAT",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/BAT/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Shell",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Shell/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Nginx",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Nginx/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Redis",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Redis/",interval:[0,4]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"ElasticSearch",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/ElasticSearch/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"FastDFS",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/FastDFS/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Naco",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Naco/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"GitLab",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/GitLab/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Git",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Git/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Gradle",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Gradle/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"IDEA",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/IDEA/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Java",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Java/",interval:[0,9]},{path:"/tag/Java/page/2/",interval:[10,11]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Jenkins",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Jenkins/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Maven",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Maven/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"K8S",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/K8S/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Linux",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Linux/",interval:[0,9]},{path:"/tag/Linux/page/2/",interval:[10,13]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Tomcat",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Tomcat/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Node.js",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Node.js/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"npm",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/npm/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Sonar",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Sonar/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"SonarQube",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/SonarQube/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"JDK",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/JDK/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Mybatis",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Mybatis/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"ActiveMQ",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/ActiveMQ/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Apache",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Apache/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"RabbitMQ",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/RabbitMQ/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"VMware",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/VMware/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"centos",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/centos/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"ubuntu",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/ubuntu/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"zookeeper",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/zookeeper/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Python",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Python/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"pytest",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/pytest/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"selenium",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/selenium/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"自动化测试",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/自动化测试/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"接口测试",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/接口测试/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"单元测试",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/单元测试/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"JUnit",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/JUnit/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Mockito",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Mockito/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"PowerMock",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/PowerMock/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"tags",id:"Spring",filter:aa.tags,sorter:oa.tags,pages:[{path:"/tag/Spring/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"categories",id:"数据结构",filter:aa.categories,sorter:oa.categories,pages:[{path:"/categories/数据结构/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"categories",id:"数据库",filter:aa.categories,sorter:oa.categories,pages:[{path:"/categories/数据库/",interval:[0,5]}],prevText:"Prev",nextText:"Next"},{pid:"categories",id:"DevOps",filter:aa.categories,sorter:oa.categories,pages:[{path:"/categories/DevOps/",interval:[0,9]},{path:"/categories/DevOps/page/2/",interval:[10,19]},{path:"/categories/DevOps/page/3/",interval:[20,22]}],prevText:"Prev",nextText:"Next"},{pid:"categories",id:"编程语言",filter:aa.categories,sorter:oa.categories,pages:[{path:"/categories/编程语言/",interval:[0,9]},{path:"/categories/编程语言/page/2/",interval:[10,12]}],prevText:"Prev",nextText:"Next"},{pid:"categories",id:"前端开发",filter:aa.categories,sorter:oa.categories,pages:[{path:"/categories/前端开发/",interval:[0,3]}],prevText:"Prev",nextText:"Next"},{pid:"categories",id:"操作系统",filter:aa.categories,sorter:oa.categories,pages:[{path:"/categories/操作系统/",interval:[0,9]},{path:"/categories/操作系统/page/2/",interval:[10,12]}],prevText:"Prev",nextText:"Next"},{pid:"categories",id:"中间件",filter:aa.categories,sorter:oa.categories,pages:[{path:"/categories/中间件/",interval:[0,8]}],prevText:"Prev",nextText:"Next"},{pid:"categories",id:"Spring",filter:aa.categories,sorter:oa.categories,pages:[{path:"/categories/Spring/",interval:[0,1]}],prevText:"Prev",nextText:"Next"},{pid:"categories",id:"测试框架",filter:aa.categories,sorter:oa.categories,pages:[{path:"/categories/测试框架/",interval:[0,5]}],prevText:"Prev",nextText:"Next"},{pid:"categories",id:"计算机术语",filter:aa.categories,sorter:oa.categories,pages:[{path:"/categories/计算机术语/",interval:[0,2]}],prevText:"Prev",nextText:"Next"},{pid:"categories",id:"Mail server",filter:aa.categories,sorter:oa.categories,pages:[{path:"/categories/Mail server/",interval:[0,1]}],prevText:"Prev",nextText:"Next"}],sa=n(238),la=n.n(sa)()("plugin-blog:pagination"),ca=function(){function e(t,n,r){Object(ea.a)(this,e),la("pagination",t);var o=t.pages,a=t.prevText,i=t.nextText,s=r.path;this._prevText=a,this._nextText=i;for(var l=0,c=o.length;l2&&void 0!==arguments[2]?arguments[2]:a.default;Ge(t),n.$vuepress.$set("siteData",t);var r=e(n.$vuepress.$get("siteData")),o=new r,i=Object.getOwnPropertyDescriptors(Object.getPrototypeOf(o)),s={};return Object.keys(i).reduce((function(e,t){return t.startsWith("$")&&(e[t]=i[t].get),e}),s),{computed:s}}((function(e){return function(){function t(){Object(ea.a)(this,t)}return Object(ta.a)(t,[{key:"setPage",value:function(e){this.__page=e}},{key:"$site",get:function(){return e}},{key:"$themeConfig",get:function(){return this.$site.themeConfig}},{key:"$frontmatter",get:function(){return this.$page.frontmatter}},{key:"$localeConfig",get:function(){var e,t,n=this.$site.locales,r=void 0===n?{}:n;for(var o in r)"/"===o?t=r[o]:0===this.$page.path.indexOf(o)&&(e=r[o]);return e||t||{}}},{key:"$siteTitle",get:function(){return this.$localeConfig.title||this.$site.title||""}},{key:"$canonicalUrl",get:function(){var e=this.$page.frontmatter.canonicalUrl;return"string"==typeof e&&e}},{key:"$title",get:function(){var e=this.$page,t=this.$page.frontmatter.metaTitle;if("string"==typeof t)return t;var n=this.$siteTitle,r=e.frontmatter.home?null:e.frontmatter.title||e.title;return n?r?r+" | "+n:n:r||"VuePress"}},{key:"$description",get:function(){var e=function(e){if(e){var t=e.filter((function(e){return"description"===e.name}))[0];if(t)return t.content}}(this.$page.frontmatter.meta);return e||(this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||"")}},{key:"$lang",get:function(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"}},{key:"$localePath",get:function(){return this.$localeConfig.path||"/"}},{key:"$themeLocaleConfig",get:function(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}}},{key:"$page",get:function(){return this.__page?this.__page:function(e,t){for(var n=0;n - + @@ -45,10 +45,10 @@ 操作系统
  • 检查语法

    ansible-playbook --syntax-check test.yml
     
    1
  • 执行命令

    ansible-playbook test.yml
    -
    1
  • # 参考资料

    https://docs.ansible.com/ansible/latest/index.html (opens new window)

    # Python API

    https://docs.ansible.com/ansible/2.9/dev_guide/developing_api.html (opens new window)

    https://docs.ansible.com/ansible/latest/dev_guide/developing_api.html (opens new window)

    # 参考资料

    https://docs.ansible.com/ansible/latest/index.html (opens new window)

    - +

    + diff --git a/category/devops/atguigu_ShardingSphere5.html b/category/devops/atguigu_ShardingSphere5.html index ed3eef0c..042a0d1e 100644 --- a/category/devops/atguigu_ShardingSphere5.html +++ b/category/devops/atguigu_ShardingSphere5.html @@ -19,7 +19,7 @@ - + @@ -45,10 +45,10 @@ 操作系统