<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>FuNan</title>
  <icon>https://www.gravatar.com/avatar/3f6a4005adc8f8749f606bc69cb330b6</icon>
  
  <link href="http://www.ifunan.cn/atom.xml" rel="self"/>
  
  <link href="http://www.ifunan.cn/"/>
  <updated>2022-04-14T10:02:37.669Z</updated>
  <id>http://www.ifunan.cn/</id>
  
  <author>
    <name>FuNan</name>
    <email>1186174184@qq.com</email>
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>WeChatApp</title>
    <link href="http://www.ifunan.cn/posts/b718f216/"/>
    <id>http://www.ifunan.cn/posts/b718f216/</id>
    <published>2022-04-14T09:59:20.000Z</published>
    <updated>2022-04-14T10:02:37.669Z</updated>
    
    <content type="html"><![CDATA[<h2 id="微信全局配置文件app-json"><a href="#微信全局配置文件app-json" class="headerlink" title="微信全局配置文件app.json"></a>微信全局配置文件app.json</h2><p>app.json常用配置项：</p><ul><li>pages：记录当前小程序所有页面的存放路径</li><li>windows：全局设置小程序窗口的外观</li><li>tabBar：设置小程序底部的tabBar效果</li><li>style：是否启用新版的组件样式</li></ul><p>app.json组成示意图：<br><img src= "/img/loading.gif" data-lazy-src="/images/WeChatApp/tabBarSetting.png"></p><p>小程序窗口的组成部分：<br><img src= "/img/loading.gif" data-lazy-src="/images/WeChatApp/Windows.png" alt="窗口组成部分"></p><h3 id="Windows配置项"><a href="#Windows配置项" class="headerlink" title="Windows配置项"></a>Windows配置项</h3><table><thead><tr><th align="center">属性名</th><th align="center">类型</th><th align="center">默认值</th><th align="center">说明</th></tr></thead><tbody><tr><td align="center">navigationBarTitleText</td><td align="center">String</td><td align="center">字符串</td><td align="center">导航栏标题文字内容</td></tr><tr><td align="center">navigationBarBackgroundColor</td><td align="center">HexColor</td><td align="center">#000000</td><td align="center">导航栏背景颜色，如 #000000</td></tr><tr><td align="center">navigationBarTextStyle</td><td align="center">String</td><td align="center">white</td><td align="center">导航栏标题颜色，仅支持black/white</td></tr><tr><td align="center">backgroundColor</td><td align="center">HexColor</td><td align="center">#ffffff</td><td align="center">窗口的背景色</td></tr><tr><td align="center">backgroundTextStyle</td><td align="center">String</td><td align="center">dark</td><td align="center">下拉 loading 的样式，仅支持dark/light</td></tr><tr><td align="center">enablePullDownRefresh</td><td align="center">Boolean</td><td align="center">false</td><td align="center">是否全局开启下拉刷新</td></tr><tr><td align="center">onReachBottomDistance</td><td align="center">Number</td><td align="center">50</td><td align="center">页面上拉触底事件触发时距页面底部距离，单位为px</td></tr></tbody></table><h3 id="tabBar配置项"><a href="#tabBar配置项" class="headerlink" title="tabBar配置项"></a>tabBar配置项</h3><p>作用： 是移动端应用常见的页面效果，用于<strong>实现多页面的快速切换</strong>。</p><ul><li>tabBar分为<strong>底部tabBar</strong>和<strong>顶部tabBar</strong>。</li><li>当设置为<strong>顶部tabBar</strong>时不显示icon(即按钮图标）,只显示文本。</li><li>tabBar最少2个、最多5个tab页签。<br>tabBar组成示意图及说明如下：<br><img src= "/img/loading.gif" data-lazy-src="/images/WeChatApp/tabBar.png"></li></ul><p>tabBar配置项如下</p><table><thead><tr><th align="center">属性</th><th align="center">类型</th><th align="center">必填</th><th align="center">默认值</th><th align="center">描述</th></tr></thead><tbody><tr><td align="center">position</td><td align="center">String</td><td align="center">否</td><td align="center">bottom</td><td align="center">tabBar的位置，仅支持bottom/top</td></tr><tr><td align="center">borderStyle</td><td align="center">String</td><td align="center">否</td><td align="center">black</td><td align="center">tabBar上边框的颜色，仅支持black/white</td></tr><tr><td align="center">color</td><td align="center">HexColor</td><td align="center">否</td><td align="center">&nbsp;</td><td align="center">tab上文字的默认（未选中）颜色</td></tr><tr><td align="center">selectedColor</td><td align="center">HexColor</td><td align="center">否</td><td align="center">&nbsp;</td><td align="center">tab上的文字选中时的颜色</td></tr><tr><td align="center">backgroundColor</td><td align="center">HexColor</td><td align="center">否</td><td align="center">&nbsp;</td><td align="center">tabBar的背景色</td></tr><tr><td align="center">list</td><td align="center">Array</td><td align="center">是</td><td align="center">&nbsp;</td><td align="center">tab页签的列表，最少2个、最多5个tab</td></tr></tbody></table><p><strong>每个tab项</strong>的配置选项如下</p><table><thead><tr><th align="center">属性</th><th align="center">类型</th><th align="center">必填</th><th align="center">描述</th></tr></thead><tbody><tr><td align="center">pagePath</td><td align="center">String</td><td align="center">是</td><td align="center">tab 上显示的文字</td></tr><tr><td align="center">text</td><td align="center">String</td><td align="center">是</td><td align="center">页面路径，页面必须在pages中预先定义</td></tr><tr><td align="center">iconPath</td><td align="center">String</td><td align="center">否</td><td align="center">未选中时的图标路径；当postion 为top时，不显示icon</td></tr><tr><td align="center">selectedIconPath</td><td align="center">String</td><td align="center">否</td><td align="center">选中时的图标路径；当postion为top时，不显示icon</td></tr></tbody></table>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;微信全局配置文件app-json&quot;&gt;&lt;a href=&quot;#微信全局配置文件app-json&quot; class=&quot;headerlink&quot; title=&quot;微信全局配置文件app.json&quot;&gt;&lt;/a&gt;微信全局配置文件app.json&lt;/h2&gt;&lt;p&gt;app.json常用配置项：</summary>
      
    
    
    
    <category term="微信小程序" scheme="http://www.ifunan.cn/categories/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
    
    
  </entry>
  
  <entry>
    <title>DJI调光教程</title>
    <link href="http://www.ifunan.cn/posts/fdbca6c1/"/>
    <id>http://www.ifunan.cn/posts/fdbca6c1/</id>
    <published>2022-03-14T12:19:20.000Z</published>
    <updated>2022-03-14T12:22:28.154Z</updated>
    
    <content type="html"><![CDATA[<h1 id="大疆调光"><a href="#大疆调光" class="headerlink" title="大疆调光"></a>大疆调光</h1><p>写在前面：调节三个参数：快门速度、感光度（iso）、白平衡</p><h2 id="白平衡"><a href="#白平衡" class="headerlink" title="白平衡"></a>白平衡</h2><p>白平衡的调节改为手动，<strong>根据天气调整白平衡</strong>,具体的数值参照下表:<br><img src= "/img/loading.gif" data-lazy-src="/images/DJI/baipingheng.png"></p><h2 id="直方图"><a href="#直方图" class="headerlink" title="直方图"></a>直方图</h2><p>开启<strong>直方图</strong>和<strong>过曝提示</strong>。</p><ol><li>在遥控器上点设置——拍摄——打开直方图、过曝提示。</li><li>直方图尽量向右曝光，同时也要使画面轻微过曝或不过曝(在过曝的边缘)<blockquote><p>注：直方图向左聚集表示画面暗的部分较多，聚集在右边表示较亮的部分多</p></blockquote></li></ol><h2 id="感光度"><a href="#感光度" class="headerlink" title="感光度"></a>感光度</h2><p><strong>iso白天设置最低，通过设置快门速度来调整过曝</strong>。</p><blockquote><p>注：当快门速度调节到最慢，画面还不够亮时，再去调节ISO(如天快黑了或者傍晚)</p></blockquote><h2 id="快门速度"><a href="#快门速度" class="headerlink" title="快门速度"></a>快门速度</h2><ol><li>使用快门速度调整过曝。</li><li>180度快门角法则：快门速度=1/(帧速率*2)<br>eg：帧速率30fps，则快门速度为1/60s<blockquote><p>注：此条准则与第二条注意事项冲突，是因为本应该以本条法则为准，但需要搭配ND滤镜，所需偷懒用了第二条的方法。</p></blockquote></li><li>同时拍摄天空和地底，先根据天空的亮度调好参数</li></ol><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><p>参考自：<a href="https://www.bilibili.com/video/BV1tK4y1577j?spm_id_from=333.788.b_636f6d6d656e74.154">哔哩哔哩UP</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;大疆调光&quot;&gt;&lt;a href=&quot;#大疆调光&quot; class=&quot;headerlink&quot; title=&quot;大疆调光&quot;&gt;&lt;/a&gt;大疆调光&lt;/h1&gt;&lt;p&gt;写在前面：调节三个参数：快门速度、感光度（iso）、白平衡&lt;/p&gt;
&lt;h2 id=&quot;白平衡&quot;&gt;&lt;a href=&quot;#白平衡&quot; </summary>
      
    
    
    
    <category term="DJI" scheme="http://www.ifunan.cn/categories/DJI/"/>
    
    
    <category term="DJI" scheme="http://www.ifunan.cn/tags/DJI/"/>
    
  </entry>
  
  <entry>
    <title>CSS</title>
    <link href="http://www.ifunan.cn/posts/ee69e452/"/>
    <id>http://www.ifunan.cn/posts/ee69e452/</id>
    <published>2022-02-28T02:49:35.000Z</published>
    <updated>2022-02-28T02:58:06.271Z</updated>
    
    <content type="html"><![CDATA[<h2 id="CSS语法"><a href="#CSS语法" class="headerlink" title="CSS语法"></a>CSS语法</h2><ol><li>CSS主要由两部分构成：选择器、一条或多条声明<br><img src= "/img/loading.gif" data-lazy-src="/images/CSS/CSS01.jpg"></li></ol><ul><li>选择器表示需要改变样式的HTML标签名</li><li>每条声明由一个属性和一个值组成，表示需要设置的样式属性。声明使用大括号括起来，属性和值使用冒号分隔，不同声明间使用分号分隔。示例如下：<figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">p</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="attribute">color</span>:red;</span><br><span class="line">    <span class="attribute">text-align</span>:center;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><ol start="2"><li>CSS注释：<code>/*注释*/</code></li></ol><h2 id="选择器（id和class）"><a href="#选择器（id和class）" class="headerlink" title="选择器（id和class）"></a>选择器（id和class）</h2><p>选择器用于选择指定的html元素设置样式</p><h3 id="id选择器"><a href="#id选择器" class="headerlink" title="id选择器"></a>id选择器</h3><p>id选择器使用id为<strong>特定的</strong>HTML元素指定样式</p><blockquote><p>注意：HTML中的id属性值是不允许重复的。class值允许重复</p></blockquote><p>首先在HTML为元素设置id属性，再在CSS中使用<code>#</code>定义id选择器，示例如下：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#para1</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="attribute">text-align</span>:center;</span><br><span class="line">    <span class="attribute">color</span>:red;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="class选择器"><a href="#class选择器" class="headerlink" title="class选择器"></a>class选择器</h3><p>class选择器用于描述一组元素的样式。class与id的区别是，<strong>class可以在多个元素中使用</strong>。<br>与id类似，先在HTML为元素设置class属性，再在CSS中使用<code>.</code>定义class选择器。</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.center</span> &#123;<span class="attribute">text-align</span>:center;&#125;</span><br></pre></td></tr></table></figure><h2 id="样式表"><a href="#样式表" class="headerlink" title="样式表"></a>样式表</h2><p>插入样式表的方法有三种：</p><ul><li>外部样式表</li><li>内部样式表</li><li>内联样式</li></ul><h3 id="外部样式表"><a href="#外部样式表" class="headerlink" title="外部样式表"></a>外部样式表</h3><ol><li>使用场景：样式需要应用于很多页面时。</li><li>外部样式表是写在后缀名为.css的文件中。在使用外部样式表的情况下，可以通过改变一个文件来改变整个站点的外观。</li><li>每个页面使用<code>&lt;link&gt;</code>标签链接到样式表，<code>href</code>后的值。<code>&lt;link&gt;</code>标签写在HTML头部。示例如下：<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span> <span class="attr">href</span>=<span class="string">&quot;mystyle.css&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li>在外部css文件中<strong>不能包含任何html标签</strong>，css例子如下：<figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">hr</span> &#123;<span class="attribute">color</span>:sienna;&#125;</span><br><span class="line"><span class="selector-tag">p</span> &#123;<span class="attribute">margin-left</span>:<span class="number">20px</span>;&#125;</span><br><span class="line"><span class="selector-tag">body</span> &#123;<span class="attribute">background-image</span>:<span class="built_in">url</span>(<span class="string">&quot;/images/back40.gif&quot;</span>);&#125;</span><br></pre></td></tr></table></figure></li></ol><h3 id="内部样式表"><a href="#内部样式表" class="headerlink" title="内部样式表"></a>内部样式表</h3><ol><li>使用场景：单个文档需要特殊的样式时。</li><li>使用<code>&lt;style&gt;</code>标签在HTML头部定义内部样式表，例子如下：<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span>&gt;</span></span><br><span class="line">        hr&#123;</span><br><span class="line"><span class="css">            <span class="selector-tag">color</span><span class="selector-pseudo">:sienna</span>;</span></span><br><span class="line">        &#125;</span><br><span class="line">        p&#123;</span><br><span class="line">            margin-left: 20px;</span><br><span class="line">        &#125;</span><br><span class="line">        body&#123;</span><br><span class="line">            background-image: url(&quot;images/back40.gif&quot;);</span><br><span class="line">        &#125;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ol><h3 id="内联样式"><a href="#内联样式" class="headerlink" title="内联样式"></a>内联样式</h3><ol><li>使用场景：当样式仅需要在一个元素上应用一次时。（慎用，不推荐）</li><li>在相关标签内使用<code>style</code>属性设置CSS样式。例子如下：<br><code>&lt;p style=&quot;color:sienna;margin-left:20px&quot;&gt;这是一个段落。&lt;/p&gt;</code></li></ol><h3 id="多重样式优先级"><a href="#多重样式优先级" class="headerlink" title="多重样式优先级"></a>多重样式优先级</h3><p>优先级顺序</p><ul><li>通用选择器（*）</li><li>元素(类型)选择器</li><li>class选择器</li><li>属性选择器</li><li>伪类</li><li>ID选择器</li><li>内联样式</li></ul><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>CSS背景属性用于定义HTML元素背景<br>几种定义背景的样式：</p><ul><li>background：简写属性，默认颜色优先</li><li>background-color：设置元素背景颜色</li><li>background-image：将图片设为背景</li><li>background-repeat：背景图像是否以及如何重复</li><li>background-attachment：背景图像是否固定或者随着页面其余部分滚动</li><li>background-position：设置背景图像的起始位置</li><li>background-size：设置图片大小，默认单位是像素px</li></ul><h3 id="color"><a href="#color" class="headerlink" title="color"></a>color</h3><p>使用<code>background-color</code>定义颜色</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">h1</span> &#123;<span class="attribute">background-color</span>:<span class="number">#6495ed</span>;&#125;</span><br><span class="line"><span class="selector-tag">p</span> &#123;<span class="attribute">background-color</span>:<span class="number">#e0ffff</span>;&#125;</span><br><span class="line"><span class="selector-tag">div</span> &#123;<span class="attribute">background-color</span>:<span class="number">#b0c4de</span>;&#125;</span><br></pre></td></tr></table></figure><h3 id="image"><a href="#image" class="headerlink" title="image"></a>image</h3><p>使用<code>background-image</code>定义背景图片。默认情况下，背景图像为平铺重复显示。<br>如未设置<code>background-position</code>属性，图像默认显示在左上角。</p><h3 id="repeat"><a href="#repeat" class="headerlink" title="repeat"></a>repeat</h3><p>先介绍下几个词的释义：</p><ul><li>平铺：<code>div</code>设置宽高40，图片的宽高只有20，那么图片会自动填满div剩余的空位</li><li>水平平铺（X）：只填满横向的空位</li><li>垂直平铺（y）：只填满纵向的空位</li></ul><p>使用<code>background-repeat</code>设置图像只在水平方向平铺（repeat-x)。<br>使用场景：因为默认情况下<code>image</code>会在页面的水平和垂直方向平铺,如果看着不协调，可以设置为<strong>只在一个方向平铺</strong>。</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">body</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="attribute">background-image</span>:<span class="built_in">url</span>(<span class="string">&#x27;gradient2.png&#x27;</span>);</span><br><span class="line"><span class="attribute">background-repeat</span>:repeat-x;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>backgrouond-repeat</code>的几个值：</p><table><thead><tr><th align="center">值</th><th align="center">描述</th></tr></thead><tbody><tr><td align="center">repeat</td><td align="center">默认，背景图像将在垂直方向和水平方向重复</td></tr><tr><td align="center">repeat-x</td><td align="center">背景图像在水平方向重复</td></tr><tr><td align="center">repeat-y</td><td align="center">背景图像在垂直方向重复</td></tr><tr><td align="center">no-repeat</td><td align="center">背景图像只显示一次</td></tr><tr><td align="center">inherit</td><td align="center">从父元素继承 background-repeat 属性的设置</td></tr></tbody></table><h3 id="position"><a href="#position" class="headerlink" title="position"></a>position</h3><p>使用<code>background-position</code>改变图片在背景中的位置。下面介绍几个position的值。</p><p>第一种值：</p><table><thead><tr><th align="center"></th><th align="center">top</th><th align="center">center</th><th align="center">bottom</th></tr></thead><tbody><tr><td align="center">left</td><td align="center">left top</td><td align="center">left center</td><td align="center">left bottom</td></tr><tr><td align="center">right</td><td align="center">right top</td><td align="center">right center</td><td align="center">right bottom</td></tr><tr><td align="center">center</td><td align="center">center top</td><td align="center">center center</td><td align="center">center bottom</td></tr></tbody></table><blockquote><p>注：如果只写了一个值，那么第二个值默认为<code>center</code>。</p></blockquote><p>第二种值：</p><table><thead><tr><th align="center">x%</th><th align="center">y%</th></tr></thead><tbody><tr><td align="center">水平位置</td><td align="center">垂直位置</td></tr></tbody></table><blockquote><p>注：左上角是0%0%，右下角是100%100%。如果只规定了一个值，另一个<strong>默认是50%</strong></p></blockquote><p>第三种值：</p><table><thead><tr><th align="center">xpos</th><th align="center">ypos</th></tr></thead><tbody><tr><td align="center">水平位置</td><td align="center">垂直位置</td></tr></tbody></table><blockquote><p>注：左上角是0 0。默认单位是像素px,可以设置为其他单位。如果只规定了一个值，另一个**默认是50%**。x%和xpos可以混用。</p></blockquote><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">body</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="attribute">background-image</span>:<span class="built_in">url</span>(<span class="string">&#x27;img_tree.png&#x27;</span>);</span><br><span class="line"><span class="attribute">background-repeat</span>:no-repeat;</span><br><span class="line"><span class="attribute">background-position</span>:right top;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="文本格式"><a href="#文本格式" class="headerlink" title="文本格式"></a>文本格式</h2><h3 id="文本颜色"><a href="#文本颜色" class="headerlink" title="文本颜色"></a>文本颜色</h3><p><code>color</code>用于设置<strong>文字的颜色</strong>（即仅对文字生效）。<br>三种指定颜色的方式：</p><ul><li>十六进制：#FF0000</li><li>RGB：RGB(255,0,0)</li><li>颜色英文：red</li></ul><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">body</span> &#123;<span class="attribute">color</span>:red;&#125;</span><br><span class="line"><span class="selector-tag">h1</span> &#123;<span class="attribute">color</span>:<span class="number">#00ff00</span>;&#125;</span><br><span class="line"><span class="selector-tag">h2</span> &#123;<span class="attribute">color</span>:<span class="built_in">rgb</span>(<span class="number">255</span>,<span class="number">0</span>,<span class="number">0</span>);&#125;</span><br></pre></td></tr></table></figure><h3 id="对齐方式"><a href="#对齐方式" class="headerlink" title="对齐方式"></a>对齐方式</h3><p>使用<code>text-align</code>属性定义对齐方式。</p><table><thead><tr><th align="center">值</th><th align="center">功能</th></tr></thead><tbody><tr><td align="center">left</td><td align="center">左对齐，默认值</td></tr><tr><td align="center">right</td><td align="center">右对齐</td></tr><tr><td align="center">center</td><td align="center">居中对齐</td></tr><tr><td align="center">justify</td><td align="center">两端对齐</td></tr><tr><td align="center">inherit</td><td align="center">从父元素继承 text-align 属性的值</td></tr></tbody></table><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">h1</span> &#123;<span class="attribute">text-align</span>:center;&#125;</span><br><span class="line"><span class="selector-tag">p</span><span class="selector-class">.date</span> &#123;<span class="attribute">text-align</span>:right;&#125;</span><br><span class="line"><span class="selector-tag">p</span><span class="selector-class">.main</span> &#123;<span class="attribute">text-align</span>:justify;&#125;</span><br></pre></td></tr></table></figure><h3 id="文本修饰"><a href="#文本修饰" class="headerlink" title="文本修饰"></a>文本修饰</h3><p>使用<code>text-decoration</code>设置或删除文本的修饰。<strong>主要用于删除链接的下划线</strong>。<br><code>&lt;p&gt;链接到: &lt;a href=&quot;//www.runoob.com/&quot;&gt;runoob.com&lt;/a&gt;&lt;/p&gt;</code></p><h3 id="大小写转换"><a href="#大小写转换" class="headerlink" title="大小写转换"></a>大小写转换</h3><p>使用<code>text-transform</code>设置单词的大小写。</p><ul><li>uppercase：全部大写</li><li>lowercase：全部小写</li><li>capitalize：单词首字母大写</li></ul><h3 id="文本缩进"><a href="#文本缩进" class="headerlink" title="文本缩进"></a>文本缩进</h3><p>使用<code>text-indent</code>指定文本第一行缩进<br><code>p {text-indent:50px;}</code></p><p><a href="https://www.runoob.com/css/css-text.html">更多CSS文本属性</a></p><p>本文参考自菜鸟教程</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;CSS语法&quot;&gt;&lt;a href=&quot;#CSS语法&quot; class=&quot;headerlink&quot; title=&quot;CSS语法&quot;&gt;&lt;/a&gt;CSS语法&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;CSS主要由两部分构成：选择器、一条或多条声明&lt;br&gt;&lt;img src= &quot;/img/loading.g</summary>
      
    
    
    
    <category term="Web" scheme="http://www.ifunan.cn/categories/Web/"/>
    
    
    <category term="CSS" scheme="http://www.ifunan.cn/tags/CSS/"/>
    
  </entry>
  
  <entry>
    <title>HTML</title>
    <link href="http://www.ifunan.cn/posts/2eec1551/"/>
    <id>http://www.ifunan.cn/posts/2eec1551/</id>
    <published>2022-02-22T03:37:43.000Z</published>
    <updated>2022-02-22T14:53:08.754Z</updated>
    
    <content type="html"><![CDATA[<h2 id="HTML-简介"><a href="#HTML-简介" class="headerlink" title="HTML 简介"></a>HTML 简介</h2><h3 id="HTML-标签"><a href="#HTML-标签" class="headerlink" title="HTML 标签"></a>HTML 标签</h3><ul><li>HTML标签由尖括号包围的关键词,如<code>&lt;html&gt;</code></li><li>标签通常成对出现，如<code>&lt;p&gt;&lt;/p&gt;</code></li><li>通常HTML标签和HTML元素表达的是一个意思</li><li><a href="https://www.runoob.com/tags/html-reference.html">标签大全</a></li><li><strong>正常情况下HTML都会在标签前后自动添加空行</strong></li><li>您无法通过在 HTML 代码中添加额外的空格或换行来改变输出的效果，当显示页面时，浏览器会移除源代码中多余的空格和空行。所有连续的空格或空行都会被算作一个空格。需要注意的是，HTML 代码中的所有连续的空行（换行）也被显示为一个空格。</li></ul><h2 id="HTML属性"><a href="#HTML属性" class="headerlink" title="HTML属性"></a>HTML属性</h2><ul><li>属性一般写在<strong>开始标签</strong></li><li>总是以名称/值 的形式出现，如href=”<a href="https://www.baidu.com&quot;/">https://www.baidu.com&quot;</a></li></ul><h2 id="HTML-基础"><a href="#HTML-基础" class="headerlink" title="HTML 基础"></a>HTML 基础</h2><h3 id="标题"><a href="#标题" class="headerlink" title="标题"></a>标题</h3><p>通过<code>h1&gt;-&lt;h6&gt;</code>标签定义,数字越大标题越小<br>不要为了粗体和大号字体而使用标签</p><h3 id="段落"><a href="#段落" class="headerlink" title="段落"></a>段落</h3><p>通过<code>&lt;p&gt;</code>标签定义</p><h3 id="文本格式化"><a href="#文本格式化" class="headerlink" title="文本格式化"></a>文本格式化</h3><table><thead><tr><th align="center">标签</th><th align="center">描述</th></tr></thead><tbody><tr><td align="center"><code>&lt;b&gt;</code></td><td align="center">定义粗体文字</td></tr><tr><td align="center"><code>&lt;em&gt;</code></td><td align="center">定义着重文字</td></tr><tr><td align="center"><code>&lt;i&gt;</code></td><td align="center">定义斜体字</td></tr><tr><td align="center"><code>&lt;small&gt;</code></td><td align="center">定义小号字</td></tr><tr><td align="center"><code>&lt;strong&gt;</code></td><td align="center">定义加重语气</td></tr><tr><td align="center"><code>&lt;sub&gt;</code></td><td align="center">定义下标字</td></tr><tr><td align="center"><code>&lt;ins&gt;</code></td><td align="center">定义插入字</td></tr><tr><td align="center"><code>&lt;del&gt;</code></td><td align="center">定义删除字</td></tr></tbody></table><h3 id="链接"><a href="#链接" class="headerlink" title="链接"></a>链接</h3><p>通过<code>&lt;a&gt;</code>标签定义</p><ul><li>href属性：在开始标签定义，用于指定链接地址</li><li>target：<code>_blank</code>新窗口打开；<code>_parent</code>父窗口打开；<code>_self</code>默认选项 当前页面跳转；<code>_top</code>在当前窗体打开链接，并替换当前整个窗体</li><li>id属性：相当于页内快速跳转的功能，下面详解</li></ul><ol><li>首先在HTML中插入ID<code>&lt;a id=&quot;tips&quot;&gt;要跳转到的地方&lt;/a&gt;</code></li><li><strong>当前页面</strong>使用href属性跳转<code>&lt;a href=&quot;#tips&quot;&gt;点击跳转&lt;/a&gt;</code></li><li><strong>其他页面</strong>使用href属性跳转到需要的位置<code>&lt;a href=&quot;https://www.baidu.com#tips&quot;&gt;点击跳转&lt;/a&gt;</code><blockquote><p>注意：<strong>请始终将正斜杠添加到子文件夹</strong>，如href=”<a href="https://www.baidu.com/html&quot;%E4%BC%9A%E4%BA%A7%E7%94%9F%E4%B8%A4%E6%AC%A1HTTP%E8%AF%B7%E6%B1%82%EF%BC%8C%E8%80%8Chref=&quot;https://www.baidu.com/html/&quot;%E5%8F%AA%E4%BC%9A%E4%BA%A7%E7%94%9F%E4%B8%80%E6%AC%A1%EF%BC%8C%E5%BA%94%E8%AF%A5%E7%94%A8%E5%90%8E%E9%9D%A2%E8%BF%99%E7%A7%8D">https://www.baidu.com/html&quot;会产生两次HTTP请求，而href=&quot;https://www.baidu.com/html/&quot;只会产生一次，应该用后面这种</a></p></blockquote></li></ol><h3 id="图像"><a href="#图像" class="headerlink" title="图像"></a>图像</h3><p>通过<code>&lt;img&gt;</code>标签定义，此标签<strong>无结束标签</strong></p><ul><li>src属性：找到图片所存放的位置</li><li>alt：图片加载失败后自定义提示信息</li><li>width：图片的宽度，默认单位<strong>像素</strong></li><li>height：图片的高度</li></ul><h3 id="表格"><a href="#表格" class="headerlink" title="表格"></a>表格</h3><p>通过<code>&lt;table&gt;</code>标签定义，tr(table row)表示行，td(table data)表示列，th(table head)表示表格标题</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">table</span> <span class="attr">border</span>=<span class="string">&quot;1&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">tr</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">th</span>&gt;</span>Header 1<span class="tag">&lt;/<span class="name">th</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">th</span>&gt;</span>Header 2<span class="tag">&lt;/<span class="name">th</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">tr</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">tr</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">td</span>&gt;</span>row 1, cell 1<span class="tag">&lt;/<span class="name">td</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">td</span>&gt;</span>row 1, cell 2<span class="tag">&lt;/<span class="name">td</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">tr</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">tr</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">td</span>&gt;</span>row 2, cell 1<span class="tag">&lt;/<span class="name">td</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">td</span>&gt;</span>row 2, cell 2<span class="tag">&lt;/<span class="name">td</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">tr</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">table</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="列表"><a href="#列表" class="headerlink" title="列表"></a>列表</h3><ol><li>无序列表使用<code>&lt;ul&gt;</code>表示(unordered list)，后跟<code>&lt;li&gt;</code><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">li</span>&gt;</span>Coffee<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">li</span>&gt;</span>Milk<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li>有序列表使用<code>&lt;ol&gt;</code>表示(orderly list)，后跟<code>&lt;li&gt;</code><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">ol</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">li</span>&gt;</span>Coffee<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">li</span>&gt;</span>Milk<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">ol</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ol><h3 id="区块div"><a href="#区块div" class="headerlink" title="区块div"></a>区块div</h3><p>div用于组合其他HTML元素的容器，与CSS一同使用可用于对大的内容块设置样式属性</p><blockquote><p>注意：<code>&lt;div&gt;</code>元素的另一个常见的用途是文档布局。它取代了使用表格定义布局的老式方法。使用<code>&lt;table&gt;</code>元素进行文档布局不是表格的正确用法。<code>&lt;table&gt;</code>元素的作用是显示表格化的数据。</p></blockquote><p>div和span的区别</p><table><thead><tr><th align="center">div</th><th align="center">span</th></tr></thead><tbody><tr><td align="center">块级元素</td><td align="center">内联元素</td></tr><tr><td align="center">会自动换行</td><td align="center">不会自动换行</td></tr></tbody></table><h3 id="表单"><a href="#表单" class="headerlink" title="表单"></a>表单</h3><p>表单使用<code>&lt;form&gt;</code>标签包含，<strong>表单的输入类型是由类型属性（type）的值决定的</strong>，常用的<code>type</code>输入类型如下：</p><ul><li>type=”text”：文本域</li><li>type=”password”：密码字段</li><li>type=”radio”：单选按钮，<strong>注意</strong>：多个单选按钮的name值必须相同，否则会出现单选按钮能多选的情况。name值相同则为同一组的意思</li><li>type=”checkbox”：复选框</li><li>type=”submit”：提交按钮。当单击提交按钮时，表单的内容会被传送到其他文件中。表单的动作属性（action）定义了目的文件的文件名。由动作属性定义的这个文件通常会对接收到的输入数据进行相关的处理。<a href="https://www.w3school.com.cn/tags/att_form_method.asp">method</a>属性规定用什么方法将表单中的数据发送出去（POST方法和GET放法二选一，默认为GET方法）。示例如下：<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">form</span> <span class="attr">name</span>=<span class="string">&quot;input&quot;</span> <span class="attr">action</span>=<span class="string">&quot;html_form_action.php&quot;</span> <span class="attr">method</span>=<span class="string">&quot;get&quot;</span>&gt;</span></span><br><span class="line">Username: <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;text&quot;</span> <span class="attr">name</span>=<span class="string">&quot;user&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;submit&quot;</span> <span class="attr">value</span>=<span class="string">&quot;Submit&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">form</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ul><p>文本域和密码字段应该加上<code>name</code>属性<br>单选按钮和复选框应该加上<code>name</code>属性和<code>value</code>属性</p><ul><li>name属性：用于对提交到服务器后的表单数据进行标识，只有设置了 name 属性的表单元素才能在提交表单时传递它们的值</li><li>value属性：用于表示选择到的按钮对应的值是什么。<code>submit</code>和<code>button</code>的value属性表示按钮上的文字</li></ul><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">form</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;radio&quot;</span> <span class="attr">name</span>=<span class="string">&quot;sex&quot;</span> <span class="attr">value</span>=<span class="string">&quot;male&quot;</span>&gt;</span>Male<span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;radio&quot;</span> <span class="attr">name</span>=<span class="string">&quot;sex&quot;</span> <span class="attr">value</span>=<span class="string">&quot;female&quot;</span>&gt;</span>Female</span><br><span class="line"><span class="tag">&lt;/<span class="name">form</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><ol><li><code>&lt;br/&gt;</code>：手动换行，后面有一个/用于关闭空元素</li><li><code>&lt;hr/&gt;</code>：水平线</li><li><code>&lt;!-- 注释 --&gt;</code></li></ol><h3 id="head中的元素"><a href="#head中的元素" class="headerlink" title="head中的元素"></a>head中的元素</h3><ol><li><code>&lt;base&gt;</code>元素<base> 标签描述了基本的链接地址/链接目标，该标签作为HTML文档中所有的链接标签的默认链接:</li><li><code>&lt;link&gt;</code>元素<link> 标签定义了文档与外部资源之间的关系。**通常用于链接到样式表**<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span> <span class="attr">href</span>=<span class="string">&quot;mystyle.css&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li><meta>每30秒刷新当前页面`<meta http-equiv="refresh" content="30">`设置网页使用的字符集`charset="utf-8"`关于head的[详细文档](https://www.runoob.com/html/html-head.html)</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;HTML-简介&quot;&gt;&lt;a href=&quot;#HTML-简介&quot; class=&quot;headerlink&quot; title=&quot;HTML 简介&quot;&gt;&lt;/a&gt;HTML 简介&lt;/h2&gt;&lt;h3 id=&quot;HTML-标签&quot;&gt;&lt;a href=&quot;#HTML-标签&quot; class=&quot;headerlink</summary>
      
    
    
    
    <category term="Web" scheme="http://www.ifunan.cn/categories/Web/"/>
    
    
    <category term="HTML" scheme="http://www.ifunan.cn/tags/HTML/"/>
    
  </entry>
  
  <entry>
    <title>样式绑定（v-bind、class、style）</title>
    <link href="http://www.ifunan.cn/posts/f88104a5/"/>
    <id>http://www.ifunan.cn/posts/f88104a5/</id>
    <published>2021-12-01T09:32:16.000Z</published>
    <updated>2021-12-01T09:33:41.164Z</updated>
    
    <content type="html"><![CDATA[<h1 id="样式绑定"><a href="#样式绑定" class="headerlink" title="样式绑定"></a>样式绑定</h1><p>前言：在HTML中，通过<strong>class属性</strong>和<strong>style属性</strong>都可以定义DOM元素的样式</p><ul><li><strong>class属性</strong>用于定义元素的类名列表</li><li><strong>style属性</strong>用于定义元素的内联样式</li><li><strong>v-bind指令</strong>对这两个属性进行绑定</li></ul><h2 id="class属性绑定"><a href="#class属性绑定" class="headerlink" title="class属性绑定"></a>class属性绑定</h2><p>首先是对元素的<strong>class属性</strong>进行绑定，<strong>绑定的对象可以是对象或数组</strong>，下面详细介绍两种对象</p><h3 id="对象语法"><a href="#对象语法" class="headerlink" title="对象语法"></a>对象语法</h3><p>将绑定的数据设置为<strong>一个对象</strong>（即类似字典），可以动态地切换元素的class。主要有3种形式</p><h4 id="内联绑定"><a href="#内联绑定" class="headerlink" title="内联绑定"></a>内联绑定</h4><p>这种绑定，将元素的class属性<strong>直接绑定为对象的形式</strong>，其中class里有两个参数，格式如下：<br><code>&lt;div v-bind:class=&quot;{参数1 : 参数2}&quot;&gt;&lt;/div&gt;</code></p><ul><li>参数1：是style里的某个样式名称，即要用哪个样式</li><li>参数2：是数据对象(data)里的属性，是一个布尔值，因为用于定义是/否使用该样式</li></ul><p>另外，在对象中还可以<strong>添加多个样式</strong>，<strong>且v-bind:class可以和普通的class属性共存</strong><br>上面的简单示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span></span><br><span class="line"><span class="css">        <span class="selector-class">.default</span> &#123;</span></span><br><span class="line">            text-decoration: underline;</span><br><span class="line">        &#125;</span><br><span class="line"><span class="css">        <span class="selector-class">.size</span> &#123;</span></span><br><span class="line">            font-size: 18px;</span><br><span class="line">        &#125;</span><br><span class="line"><span class="css">        <span class="selector-class">.color</span> &#123;</span></span><br><span class="line"><span class="css">            <span class="selector-tag">color</span>: <span class="selector-id">#6699FF</span>;</span></span><br><span class="line">        &#125;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;default&quot;</span> <span class="attr">v-bind:class</span>=<span class="string">&quot;&#123;size : isSize,color:isColor&#125;&quot;</span>&gt;</span></span><br><span class="line">        Vue.js样式绑定</span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            isSize: <span class="literal">true</span>,</span></span><br><span class="line"><span class="javascript">            isColor: <span class="literal">true</span></span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="非内联绑定"><a href="#非内联绑定" class="headerlink" title="非内联绑定"></a>非内联绑定</h4><p>将元素的class属性<strong>绑定的对象定义在data选项中</strong>（而不是直接在v-bind中定义),格式如下：<br><code>&lt;div v-bind:class=&quot;样式组名称&quot;&gt;&lt;/div&gt;</code><br>在data里定义的样式组，其里面的属性名即为某个样式名称<br>将上边的例子修改后如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;default&quot;</span> <span class="attr">v-bind:class</span>=<span class="string">&quot;classObject&quot;</span>&gt;</span></span><br><span class="line">        Vue.js样式绑定</span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line">            classObject: &#123;</span><br><span class="line"><span class="javascript">                size: <span class="literal">true</span>,<span class="comment">//size即样式名</span></span></span><br><span class="line"><span class="javascript">                color: <span class="literal">true</span>, <span class="comment">//color即样式名</span></span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="用计算属性返回样式对象"><a href="#用计算属性返回样式对象" class="headerlink" title="用计算属性返回样式对象"></a>用计算属性返回样式对象</h4><p>将元素的class属性<strong>绑定一个返回对象的计算属性</strong>。<code>这是一种常用且强大的模式</code>,格式如下：<br><code>&lt;div v-bind:class=&quot;计算属性名称&quot;&gt;&lt;/div&gt;</code><br>将上边的例子修改后如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;default&quot;</span> <span class="attr">v-bind:class</span>=<span class="string">&quot;show&quot;</span>&gt;</span></span><br><span class="line">        Vue.js样式绑定</span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            isSize: <span class="literal">true</span>,</span></span><br><span class="line"><span class="javascript">            isColor: <span class="literal">true</span>,</span></span><br><span class="line">        &#125;,</span><br><span class="line">        computed: &#123;</span><br><span class="line"><span class="javascript">            show: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">                <span class="keyword">return</span> &#123;</span></span><br><span class="line"><span class="javascript">                    size: <span class="built_in">this</span>.isSize,</span></span><br><span class="line"><span class="javascript">                    color: <span class="built_in">this</span>.isColor</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>上述代码的执行过程：</p><ol><li>先执行<code>v-bind:class=&quot;show&quot;</code></li><li>再去计算方法里找<code>show</code></li><li>计算方法里样式是否使用（true和false），则在data选项里定义</li></ol><h3 id="数组语法"><a href="#数组语法" class="headerlink" title="数组语法"></a>数组语法</h3><p>将绑定的数据设置为<strong>一个数组</strong>（即类似列表），以应用一个class列表。也主要有3种形式</p><h4 id="普通形式"><a href="#普通形式" class="headerlink" title="普通形式"></a>普通形式</h4><p>将元素的class属性<strong>直接绑定为一个数组</strong>，格式如下：<br><code>&lt;div v-bind:class=&quot;[element1, element2]&quot;&gt;&lt;/div&gt;</code><br>在上述格式中，<code>element1</code>和<code>element2</code>是数据对象(data)中的属性(即这<strong>两个参数名称</strong>和data选项中的<strong>属性名</strong>相同，对应的数据对象中的值为<strong>class列表中类名</strong><br>简单示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span></span><br><span class="line"><span class="css">    <span class="selector-class">.size</span> &#123;</span></span><br><span class="line">        font-size: 18px;</span><br><span class="line">    &#125;</span><br><span class="line"><span class="css">    <span class="selector-class">.color</span> &#123;</span></span><br><span class="line"><span class="css">        <span class="selector-tag">color</span>: <span class="selector-id">#6699FF</span>;</span></span><br><span class="line">    &#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">v-bind:class</span>=<span class="string">&quot;[isSize,isColor]&quot;</span>&gt;</span></span><br><span class="line">        Vue.js样式绑定</span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            isSize: <span class="string">&#x27;size&#x27;</span>,</span></span><br><span class="line"><span class="javascript">            isColor: <span class="string">&#x27;color&#x27;</span>,</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>注意：在data选项中的<strong>class列表类名</strong>要用单引号包含</p></blockquote><h4 id="数组中使用条件运算符（三目运算符）"><a href="#数组中使用条件运算符（三目运算符）" class="headerlink" title="数组中使用条件运算符（三目运算符）"></a>数组中使用条件运算符（三目运算符）</h4><p>数组形式绑定class属性，可以使用<strong>条件运算符构成的表达式</strong>来切换列表中的class，格式如下：<br><code>&lt;div v-bind:class=&quot;[参数1?&#39;参数2&#39;:&#39;&#39;,参数3]&quot;&gt;</code></p><ul><li>参数1：data中的属性名称</li><li>参数2：class类名，即样式名称，注意用单引号包含</li><li>冒号后的单引号为空，意思是当参数1不满足条件时，什么也不做</li><li>参数3：其他样式的名称</li></ul><p>示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">v-bind:class</span>=<span class="string">&quot;[isSize?&#x27;size&#x27;:&#x27;&#x27;,colorClass]&quot;</span>&gt;</span></span><br><span class="line">        Vue.js样式绑定</span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            isSize: <span class="literal">true</span>,</span></span><br><span class="line"><span class="javascript">            colorClass: <span class="string">&#x27;color&#x27;</span>,</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="数组中使用对象"><a href="#数组中使用对象" class="headerlink" title="数组中使用对象"></a>数组中使用对象</h4><p>使用条件运算符可以实现简单的元素class是否显示，但数量一多就显得繁琐。这种情况下，可以<strong>在数组中使用对象来更新class列表</strong>，格式如下：<br><code>&lt;div v-bind:class=&quot;[{size:isSize},isColor]&quot;&gt;&lt;/div&gt;</code><br>示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">v-bind:class</span>=<span class="string">&quot;[&#123;size:isSize&#125;,colorClass]&quot;</span>&gt;</span></span><br><span class="line">        Vue.js样式绑定</span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            isSize: <span class="literal">true</span>,</span></span><br><span class="line"><span class="javascript">            colorClass: <span class="string">&#x27;color&#x27;</span>,</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>注：注意区分当使用数组语法时，data选项里的参数是<code>属性值:&#39;class类名&#39;</code>的形式，而不是<code>属性值:true/false</code></p></blockquote><h2 id="内联样式绑定-style"><a href="#内联样式绑定-style" class="headerlink" title="内联样式绑定(style)"></a>内联样式绑定(style)</h2><p>上面介绍的是<strong>对元素的class属性进行绑定</strong>，下面介绍<strong>对元素的style属性进行绑定</strong><br>同样的，绑定的数据可以是<strong>对象</strong>或<strong>数组</strong></p><h3 id="对象语法-1"><a href="#对象语法-1" class="headerlink" title="对象语法"></a>对象语法</h3><ol><li>对元素的style属性进行绑定，可以将绑定的数据<strong>设置为一个对象</strong></li><li>对象中CSS属性名可以用<strong>驼峰式</strong>或<strong>短横线分隔</strong>命名</li></ol><h4 id="内联绑定-1"><a href="#内联绑定-1" class="headerlink" title="内联绑定"></a>内联绑定</h4><p>将元素的style属性<strong>直接绑定为对象</strong>。绑定后如可以设置文字的粗细大小等，格式如下：<br><code>&lt;div v-bind:style=&quot;{&#39;参数1&#39;:值1,&#39;参数2&#39;:值2}&quot;&gt;</code></p><ul><li>参数1：样式的某个参数，如font-size设置字体大小</li><li>值1：样式参数对应的值，此变量会去找data里的同名的属性的值</li></ul><p>示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">v-bind:style</span>=<span class="string">&quot;&#123;fontWeight:weight,&#x27;font-size&#x27;:fontSize+&#x27;px&#x27;&#125;&quot;</span>&gt;</span></span><br><span class="line">        Vue.js样式绑定</span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            weight: <span class="string">&#x27;bold&#x27;</span>,</span></span><br><span class="line">            fontSize: 130,</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="非内联绑定-1"><a href="#非内联绑定-1" class="headerlink" title="非内联绑定"></a>非内联绑定</h4>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;样式绑定&quot;&gt;&lt;a href=&quot;#样式绑定&quot; class=&quot;headerlink&quot; title=&quot;样式绑定&quot;&gt;&lt;/a&gt;样式绑定&lt;/h1&gt;&lt;p&gt;前言：在HTML中，通过&lt;strong&gt;class属性&lt;/strong&gt;和&lt;strong&gt;style属性&lt;/strong&gt;都</summary>
      
    
    
    
    <category term="Vue前端开发" scheme="http://www.ifunan.cn/categories/Vue%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Vue" scheme="http://www.ifunan.cn/tags/Vue/"/>
    
  </entry>
  
  <entry>
    <title>Hexo主题配置</title>
    <link href="http://www.ifunan.cn/posts/d11bc064/"/>
    <id>http://www.ifunan.cn/posts/d11bc064/</id>
    <published>2021-11-28T13:15:52.000Z</published>
    <updated>2021-11-28T13:27:17.021Z</updated>
    
    <content type="html"><![CDATA[<h1 id="主题配置与使用"><a href="#主题配置与使用" class="headerlink" title="主题配置与使用"></a>主题配置与使用</h1><h2 id="代码高亮"><a href="#代码高亮" class="headerlink" title="代码高亮"></a>代码高亮</h2><h3 id="代码书写时"><a href="#代码书写时" class="headerlink" title="代码书写时"></a>代码书写时</h3><p>当使用```这种形式来包含代码时，开头处应该加上代码块语言的类型</p><p>比如：```python</p><h3 id="主题文件配置"><a href="#主题文件配置" class="headerlink" title="主题文件配置"></a>主题文件配置</h3><p>仅针对Butterfly主题</p><p>先展示一下Hexo默认的主题配置部分：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">highlight:</span><br><span class="line">  enable: true</span><br><span class="line">  line_number: true</span><br><span class="line">  auto_detect: false</span><br><span class="line">  tab_replace: &#39;&#39;</span><br><span class="line">  wrap: true</span><br><span class="line">  hljs: false</span><br><span class="line">prismjs:</span><br><span class="line">  enable: false</span><br><span class="line">  preprocess: true</span><br><span class="line">  line_number: true</span><br><span class="line">  tab_replace: &#39;&#39;</span><br></pre></td></tr></table></figure><p>首先在Hexo主配置文件</p><ul><li>修改<code>highlight.enable</code>为<code>true</code></li><li>修改<code>highlight.hljs</code>为<code>false</code></li></ul><p>再主题配置文件</p><ul><li>修改<code>highlight_theme</code>为对应要使用的主题</li></ul><h1 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h1><ol><li><a href="https://hexo.io/zh-cn/docs/syntax-highlight">Hexo官方文档-代码高亮</a></li><li><a href="https://blog.csdn.net/qq_36237810/article/details/110238725">代码块后支持的语言类型有哪些</a></li><li><a href="https://butterfly.js.org/posts/4aa8abbe/#%E4%BB%A3%E7%A2%BC">Butterfly主题代码高亮文档</a></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;主题配置与使用&quot;&gt;&lt;a href=&quot;#主题配置与使用&quot; class=&quot;headerlink&quot; title=&quot;主题配置与使用&quot;&gt;&lt;/a&gt;主题配置与使用&lt;/h1&gt;&lt;h2 id=&quot;代码高亮&quot;&gt;&lt;a href=&quot;#代码高亮&quot; class=&quot;headerlink&quot; titl</summary>
      
    
    
    
    <category term="Hexo" scheme="http://www.ifunan.cn/categories/Hexo/"/>
    
    
  </entry>
  
  <entry>
    <title>计算属性与监听属性(computed和watch)</title>
    <link href="http://www.ifunan.cn/posts/48563237/"/>
    <id>http://www.ifunan.cn/posts/48563237/</id>
    <published>2021-11-28T08:03:47.000Z</published>
    <updated>2021-11-28T13:17:04.711Z</updated>
    
    <content type="html"><![CDATA[<h1 id="计算属性与监听属性（computed和watch）"><a href="#计算属性与监听属性（computed和watch）" class="headerlink" title="计算属性与监听属性（computed和watch）"></a>计算属性与监听属性（computed和watch）</h1><h2 id="计算属性"><a href="#计算属性" class="headerlink" title="计算属性"></a>计算属性</h2><ul><li>计算属性定义在<strong>computed</strong>选项中</li><li>当计算属性<strong>依赖的数据发生变化时</strong>，计算属性会自动更新，所有依赖该属性的<strong>数据绑定</strong>也会同步更新</li><li>最重要的一点：计算属性是一个属性，不是一个方法<br>简单示例如下：<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>原字符串：&#123;&#123;str&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>新字符串：&#123;&#123;netstr&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            str: <span class="string">&#x27;HTML*JavaScript*Vue.js&#x27;</span></span></span><br><span class="line">        &#125;,</span><br><span class="line">        computed: &#123;</span><br><span class="line"><span class="javascript">            netstr: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">                <span class="keyword">return</span> <span class="built_in">this</span>.str.split(<span class="string">&#x27;*&#x27;</span>).join(<span class="string">&#x27;+&#x27;</span>);</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure>注：当data里的str发生变化时，newstr也会自动更新</li></ul><p>计算属性＋过滤器的一个实例：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;title&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span>&gt;</span>商品名称<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span>&gt;</span>单价<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span>&gt;</span>数量<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span>&gt;</span>金额<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;content&quot;</span> <span class="attr">v-for</span>=<span class="string">&quot;value in shop&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span>&gt;</span>&#123;&#123;value.name&#125;&#125;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span>&gt;</span>&#123;&#123;value.price&#125;&#125;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span>&gt;</span>&#123;&#123;value.count&#125;&#125;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span>&gt;</span>&#123;&#123;value.price*value.count | twoDecimal&#125;&#125;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>总计：&#123;&#123;totalprice | formatPrice(&quot;￥&quot;)&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line">            shop: [&#123;</span><br><span class="line"><span class="javascript">                name: <span class="string">&#x27;OPPO R15&#x27;</span>,</span></span><br><span class="line">                price: 2999,</span><br><span class="line">                count: 3,</span><br><span class="line">            &#125;, &#123;</span><br><span class="line"><span class="javascript">                name: <span class="string">&#x27;华为P20&#x27;</span>,</span></span><br><span class="line">                price: 3699,</span><br><span class="line">                count: 2,</span><br><span class="line">            &#125;]</span><br><span class="line">        &#125;,</span><br><span class="line">        computed: &#123;</span><br><span class="line"><span class="javascript">            totalprice: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">                <span class="keyword">var</span> total = <span class="number">0</span>;</span></span><br><span class="line"><span class="javascript">                <span class="built_in">this</span>.shop.forEach(<span class="function"><span class="keyword">function</span> (<span class="params">s</span>) </span>&#123;</span></span><br><span class="line">                    total += s.price * s.count;</span><br><span class="line">                &#125;);</span><br><span class="line"><span class="javascript">                <span class="keyword">return</span> total;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;,</span><br><span class="line">        filters: &#123;</span><br><span class="line"><span class="javascript">            twoDecimal: <span class="function"><span class="keyword">function</span> (<span class="params">value</span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">                <span class="keyword">return</span> value.toFixed(<span class="number">2</span>);</span></span><br><span class="line">            &#125;,</span><br><span class="line"><span class="javascript">            formatPrice: <span class="function"><span class="keyword">function</span> (<span class="params">value, symbol</span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">                <span class="keyword">return</span> symbol + value.toFixed(<span class="number">2</span>);</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="getter和setter"><a href="#getter和setter" class="headerlink" title="getter和setter"></a>getter和setter</h3><ul><li>每一个计算属性都包含一个getter和setter</li><li><strong>getter</strong>用来执行<strong>读取值</strong>的操作，<strong>setter</strong>用来执行<strong>设置值</strong>的操作</li><li>当没有指明方法时(属性名后的function)，<strong>默认使用getter来读取数据</strong></li><li>在未设置setter的情况下给<em>计算属性</em>重新赋值，是不会触发更新的</li></ul><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;&#123;fullname&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            firstname: <span class="string">&#x27;张&#x27;</span>,</span></span><br><span class="line"><span class="javascript">            lastname: <span class="string">&#x27;斯特&#x27;</span>,</span></span><br><span class="line">        &#125;,</span><br><span class="line">        computed: &#123;</span><br><span class="line">            fullname: &#123;</span><br><span class="line"><span class="javascript">                get: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">                    <span class="keyword">return</span> <span class="built_in">this</span>.firstname + <span class="built_in">this</span>.lastname;</span></span><br><span class="line">                &#125;,</span><br><span class="line"><span class="javascript">                set: <span class="function"><span class="keyword">function</span> (<span class="params">value</span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">                    <span class="built_in">this</span>.firstname = value.substr(<span class="number">0</span>, <span class="number">1</span>);</span></span><br><span class="line"><span class="javascript">                    <span class="built_in">this</span>.lastname = value.substr(<span class="number">1</span>);</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="javascript">    vm.fullname = <span class="string">&#x27;利乌斯&#x27;</span>;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>上述示例执行过程：</p><ol><li>定义了一个计算属性fullname</li><li>在给fullname<strong>重新赋值时</strong>会自动调用setter，<strong>并将新值作为参数传递给set()方法</strong></li><li>在set()方法中定义去修改data里的属性值，当data属性值改变后，fullname也会跟着改变（而不是直接改变fullname的值，直接改变是无效的）</li></ol><h3 id="计算属性缓存"><a href="#计算属性缓存" class="headerlink" title="计算属性缓存"></a>计算属性缓存</h3><ul><li>使用计算属性时，每次获取的值都是<strong>基于依赖的缓存值</strong>（即基础值）</li><li>当页面重新渲染时，如果依赖的数据未发生改变，则计算属性值也不会改变。只有依赖的数据改变，才会重新执行getter</li></ul><p>下面给出计算属性和方法的区别</p><p><strong>计算属性</strong>：只有依赖的值发生改变时，计算属性才会变<br><strong>方法</strong>：每当页面重新渲染时，方法就会再次执行</p><h2 id="监听属性"><a href="#监听属性" class="headerlink" title="监听属性"></a>监听属性</h2><ul><li>定义：监听属性用于<strong>监听和响应Vue实例中的数据变化</strong></li><li>在监听数据对象中的属性时，每当<strong>监听的属性发生变化时</strong>，都会执行特定的操作</li><li><strong>监听属性的名字和要监听的对象相同，即要监听哪个属性，命名就和那个属性名一样</strong></li><li>定义监听属性有两种方式：<code>watch选项</code>和<code>实例方法vm.$watch()</code></li></ul><ol><li>watch选项：<code>watch:{}</code></li><li>vm.$watch()在Vue实例后面定义：<code>vm.$watch(&#39;监听对象名&#39;,function(参数){代码})</code></li></ol><p>两种方法简单示例如下，第一个参数是新值，第二个参数是旧值：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            fullname: <span class="string">&#x27;张三&#x27;</span>,</span></span><br><span class="line">        &#125;,</span><br><span class="line">        watch: &#123;</span><br><span class="line"><span class="javascript">            fullname: <span class="function"><span class="keyword">function</span> (<span class="params">newValue,oldValue</span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">                alert(<span class="string">&#x27;原值：&#x27;</span> + oldValue + <span class="string">&#x27;  新值：&#x27;</span> + newValue);</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="javascript">    vm.fullname = <span class="string">&#x27;李四&#x27;</span>;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            fullname: <span class="string">&#x27;张三&#x27;</span>,</span></span><br><span class="line">        &#125;,</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="javascript">    vm.$watch(<span class="string">&#x27;fullname&#x27;</span>, <span class="function"><span class="keyword">function</span> (<span class="params">newValue, oldValue</span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">        alert(<span class="string">&#x27;原值：&#x27;</span> + oldValue + <span class="string">&#x27;  新值：&#x27;</span> + newValue)</span></span><br><span class="line">    &#125;);</span><br><span class="line"><span class="javascript">    vm.fullname = <span class="string">&#x27;李四&#x27;</span>;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="deep选项"><a href="#deep选项" class="headerlink" title="deep选项"></a>deep选项</h3><p><strong>handler</strong><br>先简单介绍一下handler，当deep的值为true时，必须使用handler函数</p><p>如果监听的属性是一个对象（即字典），为了<strong>监听对象内部值的变化</strong>，必须在watch选项中设置<strong>deep的值为true</strong>，简单示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line">            shop: &#123;</span><br><span class="line"><span class="javascript">                name: <span class="string">&#x27;XiaoMi10&#x27;</span>,</span></span><br><span class="line">                price: 3899,</span><br><span class="line">            &#125;,</span><br><span class="line">        &#125;,</span><br><span class="line">        watch: &#123;</span><br><span class="line">            shop: &#123;</span><br><span class="line"><span class="javascript">                handler: <span class="function"><span class="keyword">function</span> (<span class="params">val</span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">                    alert(val.name + <span class="string">&#x27;新价格为&#x27;</span> + val.price);</span></span><br><span class="line">                &#125;,</span><br><span class="line"><span class="javascript">                deep: <span class="literal">true</span></span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line">    vm.shop.price = 4899;</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h1 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h1><ol><li><a href="https://blog.csdn.net/qq_42975998/article/details/104565720">vue中watch的handler，deep，immediate用法详解</a></li><li><a href="https://blog.csdn.net/weixin_36128925/article/details/113629234">vue handler ()的参数是什么</a></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;计算属性与监听属性（computed和watch）&quot;&gt;&lt;a href=&quot;#计算属性与监听属性（computed和watch）&quot; class=&quot;headerlink&quot; title=&quot;计算属性与监听属性（computed和watch）&quot;&gt;&lt;/a&gt;计算属性与监听属性（c</summary>
      
    
    
    
    <category term="Vue前端开发" scheme="http://www.ifunan.cn/categories/Vue%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Vue" scheme="http://www.ifunan.cn/tags/Vue/"/>
    
  </entry>
  
  <entry>
    <title>条件判断与列表渲染（v-if、v-show、v-for）</title>
    <link href="http://www.ifunan.cn/posts/d1fa448f/"/>
    <id>http://www.ifunan.cn/posts/d1fa448f/</id>
    <published>2021-11-18T07:43:00.000Z</published>
    <updated>2021-11-28T13:17:04.709Z</updated>
    
    <content type="html"><![CDATA[<h1 id="条件判断（v-if、v-show）"><a href="#条件判断（v-if、v-show）" class="headerlink" title="条件判断（v-if、v-show）"></a>条件判断（v-if、v-show）</h1><p>Vue.js提供了多个指令实现<strong>条件判断</strong>：v-if、v-else、v-else-if、v-show</p><h2 id="v-if指令"><a href="#v-if指令" class="headerlink" title="v-if指令"></a>v-if指令</h2><ul><li>如果表达式的值为true就输出DOM元素和包含的子元素，否则就不输出</li><li>v-if属于指令，指令必须添加到一个<strong>元素</strong>上，根据表达式的结果判断是否输出元素。</li><li>格式：<code>&lt;p v-if=&quot;表达式&quot;&gt;内容&lt;/p&gt;</code>，简单示例如下：</li></ul><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>a的值是：&#123;&#123;a&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>b的值是: &#123;&#123;b&#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span> <span class="attr">v-if</span>=<span class="string">&quot;a&lt;b&quot;</span>&gt;</span>a大于b<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span> <span class="attr">v-else</span>&gt;</span>a小于b<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el : <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data : &#123;</span><br><span class="line">            a : 8,</span><br><span class="line">            b : 4,</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="模板-lt-template-gt-元素中使用v-if"><a href="#模板-lt-template-gt-元素中使用v-if" class="headerlink" title="模板&lt;template&gt;元素中使用v-if"></a>模板<code>&lt;template&gt;</code>元素中使用v-if</h2><p>如果需要对<strong>一组元素</strong>进行判断，需要使用<code>&lt;template&gt;</code>将多个元素包含起来，<strong>并在template上使用v-if</strong>，示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">template</span> <span class="attr">v-if</span>=<span class="string">&quot;show&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;radio&quot;</span> <span class="attr">value</span>=<span class="string">&quot;A&quot;</span>&gt;</span>A</span><br><span class="line">        <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;radio&quot;</span> <span class="attr">value</span>=<span class="string">&quot;B&quot;</span>&gt;</span>B</span><br><span class="line">        <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;radio&quot;</span> <span class="attr">value</span>=<span class="string">&quot;C&quot;</span>&gt;</span>C</span><br><span class="line">        <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;radio&quot;</span> <span class="attr">value</span>=<span class="string">&quot;D&quot;</span>&gt;</span>D</span><br><span class="line">    <span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            show: <span class="literal">false</span></span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="v-else指令"><a href="#v-else指令" class="headerlink" title="v-else指令"></a>v-else指令</h2><p>v-else配合v-if使用，下例判断是否闰年并弹框:</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span> <span class="attr">v-if</span>=<span class="string">&quot;(year%4==0&amp;&amp;year%100!=0) || year%400==0&quot;</span>&gt;</span></span><br><span class="line">        &#123;&#123;show(29)&#125;&#125;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span> <span class="attr">v-else</span>&gt;</span></span><br><span class="line">        &#123;&#123;show(28)&#125;&#125;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line">            year: 2021,</span><br><span class="line">        &#125;,</span><br><span class="line">        methods: &#123;</span><br><span class="line"><span class="javascript">            show: <span class="function"><span class="keyword">function</span> (<span class="params">value</span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">                alert(<span class="built_in">this</span>.year + <span class="string">&#x27;年2月有&#x27;</span> + value + <span class="string">&#x27;天&#x27;</span>)</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="v-else-if指令"><a href="#v-else-if指令" class="headerlink" title="v-else-if指令"></a>v-else-if指令</h2><p>和前面的if和else用法类似</p><blockquote><p>注：v-else和v-else-if必须和v-if配套使用，紧跟在v-if后</p></blockquote><h2 id="v-show指令"><a href="#v-show指令" class="headerlink" title="v-show指令"></a>v-show指令</h2><ul><li>v-show根据表达式的值来判断是否显示和隐藏DOM元素（表达式为<strong>true</strong>元素显示，为<strong>false</strong>元素隐藏）</li><li>与v-if的区别：使用v-show指令的元素无论表达式的值为true还是false，<strong>该元素始终会被渲染并保留在DOM中</strong>。绑定值的改变只是简单切换元素的CSS属性display</li><li><strong>v-show不支持<temlate>元素，也不支持v-else指令</strong></li></ul><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;button&quot;</span> <span class="attr">:value</span>=<span class="string">&quot;bText&quot;</span> <span class="attr">v-on:click</span>=<span class="string">&quot;toggle&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">v-show</span>=<span class="string">&quot;show&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;../img/img_demo003.png&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data: &#123;</span><br><span class="line"><span class="javascript">            show: <span class="literal">true</span>,</span></span><br><span class="line"><span class="javascript">            bText: <span class="string">&#x27;隐藏图片&#x27;</span>,</span></span><br><span class="line">        &#125;,</span><br><span class="line">        methods: &#123;</span><br><span class="line"><span class="javascript">            toggle: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">                <span class="keyword">if</span> (<span class="built_in">this</span>.bText == <span class="string">&#x27;隐藏图片&#x27;</span>) &#123;</span></span><br><span class="line"><span class="javascript">                    <span class="built_in">this</span>.bText = <span class="string">&#x27;显示图片&#x27;</span></span></span><br><span class="line"><span class="javascript">                &#125; <span class="keyword">else</span></span></span><br><span class="line"><span class="javascript">                    <span class="built_in">this</span>.bText = <span class="string">&#x27;隐藏图片&#x27;</span></span></span><br><span class="line"><span class="javascript">                <span class="built_in">this</span>.show = !<span class="built_in">this</span>.show</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="重点：v-if和v-show比较"><a href="#重点：v-if和v-show比较" class="headerlink" title="重点：v-if和v-show比较"></a>重点：v-if和v-show比较</h2><table><thead><tr><th align="center"></th><th align="center">v-if</th><th align="center">v-show</th></tr></thead><tbody><tr><td align="center">切换角度考虑</td><td align="center">有一个局部编译/卸载的过程</td><td align="center">仅发生样式的变化</td></tr><tr><td align="center">初始渲染的角度考虑</td><td align="center">是惰性的，在初始条件为false时，v-if什么都不会做</td><td align="center">不管初始条件真假，DOM元素总是会被渲染</td></tr></tbody></table><p>由上表可知：<br>从切换角度考虑：v-if消耗的性能比v-show大<br>从初始渲染考虑：v-show消耗的性能比v-if小<br>因此：<br>如果需要<strong>频繁</strong>地切换，使用v-show较好。<br>如果<strong>运行时条件很少改变</strong>，使用v-if较好</p><h1 id="列表渲染"><a href="#列表渲染" class="headerlink" title="列表渲染"></a>列表渲染</h1><p>Vue的列表渲染功能，即将数组或对象中的数据<strong>循环渲染</strong>到DOM中。使用v-for指令，效果类似于遍历</p><table><thead><tr><th align="center">items:{}</th><th align="center">items:[]</th></tr></thead><tbody><tr><td align="center">数组</td><td align="center">对象（类似字典）</td></tr></tbody></table><h2 id="重点：v-for遍历数组"><a href="#重点：v-for遍历数组" class="headerlink" title="重点：v-for遍历数组"></a>重点：v-for遍历数组</h2><ul><li><p>根据接收数组中数据<strong>重复渲染</strong>DOM元素，格式如下，items是数组名称：<br><code>&lt;li v-for=&quot;item in items&quot;&gt;{{item.name}}&lt;/li&gt;</code><br>简单示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">ul</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span> <span class="attr">v-for</span>=<span class="string">&quot;item in items&quot;</span>&gt;</span>&#123;&#123;item.name&#125;&#125;<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el : <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data : &#123;</span><br><span class="line">            items : [</span><br><span class="line"><span class="javascript">                &#123;<span class="attr">name</span> : <span class="string">&#x27;张三&#x27;</span>&#125;,</span></span><br><span class="line"><span class="javascript">                &#123;<span class="attr">name</span> : <span class="string">&#x27;李四&#x27;</span>&#125;,</span></span><br><span class="line"><span class="javascript">                &#123;<span class="attr">name</span> : <span class="string">&#x27;王五&#x27;</span>&#125;,</span></span><br><span class="line">            ]</span><br><span class="line">        &#125;,</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>可指定一个参数作为当前数组元素的<strong>索引</strong>，格式如下(item在前,index在后)：<br><code>&lt;li v-for=&quot;(item,index) in items&quot;&gt;{{index}} {{item.name}}&lt;/li&gt;</code></p></li></ul><h2 id="数组的增删改查"><a href="#数组的增删改查" class="headerlink" title="数组的增删改查"></a>数组的增删改查</h2><table><thead><tr><th align="center">方法名</th><th align="center">说明</th></tr></thead><tbody><tr><td align="center">push()</td><td align="center">数组末尾添加一个或多个元素</td></tr><tr><td align="center">pop()</td><td align="center">移除数组最后一个元素</td></tr><tr><td align="center">shift()</td><td align="center">移除数组第一个元素</td></tr><tr><td align="center">unshift()</td><td align="center">数组开头添加一个或多个元素</td></tr><tr><td align="center"><a href="https://www.runoob.com/jsref/jsref-splice.html">splice()</a></td><td align="center">添加或删除数组中元素</td></tr><tr><td align="center">sort()</td><td align="center">对数组元素排序</td></tr><tr><td align="center">reverse()</td><td align="center">颠倒数组元素顺序</td></tr></tbody></table><p>举例一个格式：<br><code>vm.items.push({name : &#39;赵六&#39;})</code><br><code>vm</code>为Vue实例名称，<code>items</code>为数组名称</p><h2 id="v-for遍历对象（字典）"><a href="#v-for遍历对象（字典）" class="headerlink" title="v-for遍历对象（字典）"></a>v-for遍历对象（字典）</h2><p>与遍历数组类似<code>v-for=&quot;(value,key,index) in object&quot;</code></p><blockquote><ul><li>value是对象的<strong>值</strong></li><li>key是对象的<strong>键</strong></li><li>index是对象的<strong>索引</strong><br>注意value是第一个参数，key才是第二个参数，后两个参数是可选的，示例如下：</li></ul></blockquote><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">ul</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span> <span class="attr">v-for</span>=<span class="string">&quot;(value,key) in items&quot;</span>&gt;</span>&#123;&#123;key&#125;&#125;-&#123;&#123;value&#125;&#125;<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el : <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data : &#123;</span><br><span class="line">            items : &#123;</span><br><span class="line"><span class="javascript">                name : <span class="string">&#x27;张三&#x27;</span>,</span></span><br><span class="line"><span class="javascript">                sex : <span class="string">&#x27;男&#x27;</span>,</span></span><br><span class="line"><span class="javascript">                age : <span class="string">&#x27;19&#x27;</span>,</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="插入属性（键值对）到对象"><a href="#插入属性（键值对）到对象" class="headerlink" title="插入属性（键值对）到对象"></a>插入属性（键值对）到对象</h2><p>格式：</p><ul><li>全局方法：<code>Vue.set(Vue实例名.object,&#39;key&#39;,&#39;value&#39;)</code>(在Vue实例后使用）</li><li>实例方法：<code>vm.$set(Vue实例名.object,&#39;key&#39;,&#39;value&#39;)</code></li></ul><p>全局方法示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">ul</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span> <span class="attr">v-for</span>=<span class="string">&quot;(value,key,index) in items&quot;</span>&gt;</span>&#123;&#123;index&#125;&#125;-&#123;&#123;key&#125;&#125;-&#123;&#123;value&#125;&#125;<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el : <span class="string">&#x27;#box&#x27;</span>,</span></span><br><span class="line">        data : &#123;</span><br><span class="line">            items : &#123;</span><br><span class="line"><span class="javascript">                name : <span class="string">&#x27;张三&#x27;</span>,</span></span><br><span class="line"><span class="javascript">                sex : <span class="string">&#x27;男&#x27;</span>,</span></span><br><span class="line"><span class="javascript">                age : <span class="string">&#x27;19&#x27;</span>,</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="javascript">    Vue.set(vm.items,<span class="string">&#x27;interest&#x27;</span>,<span class="string">&#x27;swimming&#x27;</span>)</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>实例方法：将<code>Vue.set</code>改为<code>vm.$set</code>即可</p><p>如果想要一次性添加多个属性（多个键值对）,格式如下：<br><code>Vue实例名.字典名 = Object.assign({},Vue实例名.字典名,{键:&#39;值&#39;,键:&#39;值&#39;});</code><br>示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">vm.items = Object.assign(&#123;&#125;,vm.items,&#123;</span><br><span class="line">    interest : &#x27;swimming&#x27;,</span><br><span class="line">    address : &#x27;海南&#x27;,</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h2 id="v-for遍历整数"><a href="#v-for遍历整数" class="headerlink" title="v-for遍历整数"></a>v-for遍历整数</h2><p>接收的整数即为循环次数，会将<strong>模板</strong>重复显示，下面使用v-for打印99乘法表：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">v-for</span>=<span class="string">&quot;m in 9&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">span</span> <span class="attr">v-for</span>=<span class="string">&quot;n in m&quot;</span>&gt;</span></span><br><span class="line">            &#123;&#123;n&#125;&#125;*&#123;&#123;m&#125;&#125;=&#123;&#123;m*n&#125;&#125;</span><br><span class="line">        <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span></span><br><span class="line"><span class="javascript">    <span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span></span><br><span class="line"><span class="javascript">        el: <span class="string">&#x27;#box&#x27;</span></span></span><br><span class="line">    &#125;);</span><br><span class="line"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;条件判断（v-if、v-show）&quot;&gt;&lt;a href=&quot;#条件判断（v-if、v-show）&quot; class=&quot;headerlink&quot; title=&quot;条件判断（v-if、v-show）&quot;&gt;&lt;/a&gt;条件判断（v-if、v-show）&lt;/h1&gt;&lt;p&gt;Vue.js提供了多</summary>
      
    
    
    
    <category term="Vue前端开发" scheme="http://www.ifunan.cn/categories/Vue%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Vue" scheme="http://www.ifunan.cn/tags/Vue/"/>
    
  </entry>
  
  <entry>
    <title>Windows下Hexo配置</title>
    <link href="http://www.ifunan.cn/posts/86958cb8/"/>
    <id>http://www.ifunan.cn/posts/86958cb8/</id>
    <published>2021-11-03T09:15:51.000Z</published>
    <updated>2021-11-03T09:19:58.344Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Windows提交Hexo到GitHub"><a href="#Windows提交Hexo到GitHub" class="headerlink" title="Windows提交Hexo到GitHub"></a>Windows提交Hexo到GitHub</h1><h2 id="nodejs"><a href="#nodejs" class="headerlink" title="nodejs"></a>nodejs</h2><p>npm: nodejs下的包管理器</p><ol><li>访问<a href="https://nodejs.org/zh-cn/">nodejs官网</a>下载nodejs</li><li>下载后点击安装Nodejs，改变安装路径，点击选择<code>Add to PATH</code>，最后点击Finish完成安装</li><li>在cmd窗口<code>node -v</code>查看nodejs安装情况，<code>npm -v</code>查看npm安装情况（默认情况下npm版本都有点旧）</li></ol><h2 id="Hexo"><a href="#Hexo" class="headerlink" title="Hexo"></a>Hexo</h2><p>在安装好nodejs、npm、git后，执行以下步骤</p><ol><li>在选择的目录下打开git界面，配置安装Hexo<br><code>npm install hexo-cli -g</code>，<code>npm install hexo --save</code></li></ol><h2 id="配置Git"><a href="#配置Git" class="headerlink" title="配置Git"></a>配置Git</h2><ol><li>配置用户名和邮箱<br><code>git config --global user.name &quot;XXX&quot;</code>，<code>git config --global user.email &quot;XXX&quot;</code></li><li>查看用户名和邮箱<br><code>git config user.name</code>，<code>git config user.email</code></li><li>查看当前Git环境所有配置<br><code>git config --list</code></li></ol><h2 id="配置GitHub"><a href="#配置GitHub" class="headerlink" title="配置GitHub"></a>配置GitHub</h2><ol><li>在Git生成配置密钥，生成过程中按三次回车，存放在windows用户目录的.ssh下<br><code>ssh-keygen -t rsa -C &quot;邮箱&quot;</code></li><li>复制<code>id_rsa.pub</code>文件中的密钥</li><li>在GitHub上点击头像——Settings——SSH and GPG keys——New SSH key，粘贴复制的密钥</li><li>完成后保存回到Git界面，验证配置SSH Key是否成功，弹出的选项选择<code>yes</code>(出现Hi Fu-Nan! You’ve successfully…类似文字即为成功<br><code>ssh -T git@github.com</code></li></ol><h2 id="上传内容到GitHub"><a href="#上传内容到GitHub" class="headerlink" title="上传内容到GitHub"></a>上传内容到GitHub</h2><ol><li>编辑好内容后使用<code>hexo g</code>生成页面</li><li>在当前文件夹初始化git（不影响当下的资源）<br><code>git init</code></li><li>添加该项目下所有文件到队列<br><code>git add .</code></li><li>将文件添加到仓库中<br><code>git commit -m &#39;说明信息&#39;</code></li><li>在GitHub创建一个仓库</li><li>将本地仓库关联到远程仓库<br><code>git remote add origin 仓库http地址</code></li><li>将本地代码推送到指定远程仓库中<br><code>git push -u origin main</code></li></ol><h2 id="友情链接"><a href="#友情链接" class="headerlink" title="友情链接"></a>友情链接</h2><p>Windows安装npm教程：<a href="https://www.cnblogs.com/jianguo221/p/11487532.html">https://www.cnblogs.com/jianguo221/p/11487532.html</a><br>nodejs详细安装步骤：<a href="https://blog.csdn.net/muzidigbig/article/details/80493880">https://blog.csdn.net/muzidigbig/article/details/80493880</a><br>Git上传项目：<a href="https://www.cnblogs.com/ql123456/p/10626810.html">https://www.cnblogs.com/ql123456/p/10626810.html</a><br>GitHub配置SSH Key：<a href="https://blog.csdn.net/u013778905/article/details/83501204">https://blog.csdn.net/u013778905/article/details/83501204</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Windows提交Hexo到GitHub&quot;&gt;&lt;a href=&quot;#Windows提交Hexo到GitHub&quot; class=&quot;headerlink&quot; title=&quot;Windows提交Hexo到GitHub&quot;&gt;&lt;/a&gt;Windows提交Hexo到GitHub&lt;/h1&gt;&lt;</summary>
      
    
    
    
    <category term="Hexo" scheme="http://www.ifunan.cn/categories/Hexo/"/>
    
    
  </entry>
  
  <entry>
    <title>Vue前端开发</title>
    <link href="http://www.ifunan.cn/posts/3b8f226c/"/>
    <id>http://www.ifunan.cn/posts/3b8f226c/</id>
    <published>2021-11-03T08:43:00.000Z</published>
    <updated>2021-11-28T12:46:13.134Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">&quot;en&quot;</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;UTF-8&quot;</span>&gt;</span><br>   <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>第一个实例<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span><br>   <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/javascript&quot;</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;../JS/vue.js&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><br>   <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>&#123;&#123;message&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="javascript">   <span class="hljs-keyword">var</span> vm = <span class="hljs-keyword">new</span> Vue(&#123;</span><br><span class="javascript">      el : <span class="hljs-string">&#x27;#box&#x27;</span>,</span><br>       data : &#123;<br><span class="javascript">            message : <span class="hljs-string">&#x27;I Like Vue!&#x27;</span></span><br>       &#125;<br>  &#125;);<br><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span><br></code></pre></td></tr></table></figure><blockquote><p>首先引入Vue文件。div块里的<code>message</code>变量与vue<code>data</code>中的<code>message</code>变量相关联，改变data里<code>message</code>值就会同步改变页面的内容。注意在创建Vue实例后加上一个分号。<code>message</code>里的内容必须是单引号包含的，不能是双引号。</p></blockquote><ol><li>var为声明变量</li><li><code>//</code>是注释</li></ol><h1 id="基础特性"><a href="#基础特性" class="headerlink" title="基础特性"></a>基础特性</h1><h2 id="Vue实例和选项"><a href="#Vue实例和选项" class="headerlink" title="Vue实例和选项"></a>Vue实例和选项</h2><p>在创建对象实例时，可以在<strong>构造函数</strong>中传入一个<strong>选项对象</strong>。<strong>选项对象</strong>包括挂载元素、数据、方法、生命周期钩子函数。</p><h3 id="挂载元素"><a href="#挂载元素" class="headerlink" title="挂载元素"></a>挂载元素</h3><p>Vue实例中的<code>el</code>选项为实例本身提供挂载元素。定义挂载元素后接下来的全部操作都在该元素里进行，元素外部不受影响。</p><blockquote><p>即el是绑定的由<code>id</code>标识的div块，后续的实例操作也是仅仅操作那一个div，而不影响另外的div。</p></blockquote><p><code>&lt;div id=&quot;box&quot; class=&quot;box&quot;&gt;&lt;/div&gt;</code><br>这里挂载元素有三种方式：<code>el:&#39;#box&#39;</code>，<code>el:&#39;.box&#39;</code>，<code>el:&#39;div&#39;</code>。</p><h3 id="数据"><a href="#数据" class="headerlink" title="数据"></a>数据</h3><p>使用<code>data</code>选项定义<strong>数据</strong>，数据可以绑定到实例对应的模板(即div)中。示例如下：</p><pre><code>&lt;div id=&quot;box&quot;&gt;    &lt;h1&gt;网站名称：{{name}}&lt;/h1&gt;    &lt;h1&gt;网站地址：{{url}}&lt;/h1&gt;&lt;/div&gt;&lt;script type=&quot;text/javascript&quot;&gt;    var vm = new Vue({        el : &#39;#box&#39;,        data : {            name : &#39;ifunan&#39;,          url : &#39;www.ifunan.cn&#39;        }    });&lt;/script&gt;</code></pre><blockquote><p>首选创建了一个Vue实例<code>vm</code>，模板中<code>{{name}}</code>用于输出name属性值，<code>{{url}}</code>用于输出url属性值。即<strong>data数据与DOM进行了关联</strong></p></blockquote><ul><li>放在双大括号标签内的文本称为绑定表达式</li><li>在创建Vue实例时，如果给data赋值一个对象，那么Vue实例会代理data对象中所有的属性。<br>当属性值发生变化，HTML视图也会发生相应变化。所以<strong>data对象中定义的属性称为响应式属性</strong>。示例如下：</li></ul><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>网站名称：&#123;&#123;name&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>网站地址：&#123;&#123;url&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="javascript">    <span class="hljs-keyword">var</span> data = &#123;<span class="hljs-attr">name</span>:<span class="hljs-string">&#x27;ifunan&#x27;</span>,<span class="hljs-attr">url</span>:<span class="hljs-string">&#x27;www.ifunan.cn&#x27;</span>&#125;;</span><br><span class="javascript">    <span class="hljs-keyword">var</span> vm = <span class="hljs-keyword">new</span> Vue(&#123;</span><br><span class="javascript">        el : <span class="hljs-string">&#x27;#box&#x27;</span>,</span><br>        data : data,<br>    &#125;);<br><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br></code></pre></td></tr></table></figure><p>注：只有在对象实例里的数据才是响应式的。</p><h3 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h3><p>使用<code>methods</code>选项定义<strong>方法</strong>，示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">h3</span>&gt;</span>&#123;&#123;showInfo()&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="javascript">    <span class="hljs-keyword">var</span> vm = <span class="hljs-keyword">new</span> Vue(&#123;</span><br><span class="javascript">        el : <span class="hljs-string">&#x27;#box&#x27;</span>,</span><br>        data : &#123;<br><span class="javascript">            name : <span class="hljs-string">&#x27;ifunan&#x27;</span>,</span><br><span class="javascript">            url : <span class="hljs-string">&#x27;www.ifunan.cn&#x27;</span>,</span><br>        &#125;,<br>        methods : &#123;<br><span class="javascript">            showInfo : <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>&#123;</span><br><span class="javascript">                <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.name + <span class="hljs-string">&#x27;: &#x27;</span> +<span class="hljs-built_in">this</span>.uri;</span><br>            &#125;<br>        &#125;<br>    &#125;);<br><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br></code></pre></td></tr></table></figure><blockquote><ol><li>调用方法和使用data属性值相同，在div块里使用两个{{方法名}}包括住方法。</li><li><code>methods</code>和<code>data</code>是平级的，所以在<code>data</code>写完后加上一个逗号，下面写方法。（data和methods在格式上有很多相似之处）</li><li>return写完后要加上一个分号<code>;</code></li></ol></blockquote><h3 id="生命周期钩子函数"><a href="#生命周期钩子函数" class="headerlink" title="生命周期钩子函数"></a>生命周期钩子函数</h3><h2 id="数据绑定"><a href="#数据绑定" class="headerlink" title="数据绑定"></a>数据绑定</h2><p>建立数据绑定后，数据和视图会相互关联，当数据发生变化时，视图会自动更新。</p><h3 id="插值"><a href="#插值" class="headerlink" title="插值"></a>插值</h3><h4 id="文本插值"><a href="#文本插值" class="headerlink" title="文本插值"></a>文本插值</h4><p>文本插值是数据绑定最基本的形式，双大括号标签<code>{{}}</code>，示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>&#123;&#123;name&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="javascript">    <span class="hljs-keyword">var</span> vm = <span class="hljs-keyword">new</span> Vue(&#123;</span><br><span class="javascript">        el : <span class="hljs-string">&#x27;#box&#x27;</span>,</span><br>        data : &#123;<br><span class="javascript">            name : <span class="hljs-string">&#x27;vue.js&#x27;</span>,</span><br>        &#125;<br>    &#125;);<br><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br></code></pre></td></tr></table></figure><p>此处将<code>{{name}}</code>与data里的<code>name</code>属性进行了绑定，当<code>name</code>属性发生了变化，<code>{{name}}</code>也将一起发生变化</p><p>如果只渲染一次数据，可以使用<strong>单次插值：v-once指令</strong>，即在第一次插入文本后，当数据对象中属性值发生变化时，<code>{{name}}</code>并不会发生变化。示例如下：</p><pre><code>&lt;div id=&quot;box&quot;&gt;    &lt;h2 v-once&gt;hello {{name}}&lt;/h2&gt;&lt;/div&gt;</code></pre><h4 id="插入HTML（v-html指令）"><a href="#插入HTML（v-html指令）" class="headerlink" title="插入HTML（v-html指令）"></a>插入HTML（v-html指令）</h4><p>在双大括号标签{{}}里的值会<strong>当作普通文本</strong>处理。如果想在标签里再插入一个HTML标签，可以使用<strong>v-html</strong>，示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">v-html</span>=<span class="hljs-string">&quot;message&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="javascript">    <span class="hljs-keyword">var</span> vm = <span class="hljs-keyword">new</span> Vue(&#123;</span><br><span class="javascript">        el : <span class="hljs-string">&#x27;#box&#x27;</span>,</span><br>        data : &#123;<br><span class="handlebars"><span class="xml">            message : &#x27;<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>科技是第生产力<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>&#x27;,</span></span><br>        &#125;<br>    &#125;);<br><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br></code></pre></td></tr></table></figure><blockquote><p>注意： v-html是在标签里使用等号；<br>标签使用双引号包含，而非双大括号</p></blockquote><h4 id="属性（v-bind指令）"><a href="#属性（v-bind指令）" class="headerlink" title="属性（v-bind指令）"></a>属性（v-bind指令）</h4><p>先简单介绍一下<strong>HTML属性</strong>(标签和元素一个意思）：</p><ol><li>属性提供一个标签/元素的补充信息</li><li>属性总是在开始标签/元素中指定</li><li>属性以键值对形式出现，比如<code>键名=&quot;键值&quot;</code><br>eg:<code>&lt;a href=&quot;http://www.baidu.com&quot;&gt;This is a link&lt;/a&gt;</code><br>在这里<code>&lt;a&gt;</code>是开始标签，<code>&lt;/a&gt;</code>是结束标签；<code>href=</code>是标签<code>&lt;a&gt;</code>的<strong>属性</strong></li></ol><p>下面开始介绍vue的属性</p><p>要为HTML标签绑定属性，不能直接使用文本插值的方式。需要使用<strong>v-bind指令</strong>对属性进行绑定。示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>&#123;&#123;message&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">v-bind:href</span>=<span class="hljs-string">&quot;url&quot;</span>&gt;</span>百度链接<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="javascript">    <span class="hljs-keyword">var</span> vm = <span class="hljs-keyword">new</span> Vue(&#123;</span><br><span class="javascript">        el : <span class="hljs-string">&#x27;#box&#x27;</span>,</span><br>        data : &#123;<br><span class="javascript">            message : <span class="hljs-string">&#x27;一个链接页面&#x27;</span>,</span><br><span class="javascript">            url : <span class="hljs-string">&#x27;https://www.baidu.com/&#x27;</span>,</span><br>        &#125;<br>    &#125;);<br><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br></code></pre></td></tr></table></figure><p>在上述例子中，使用<strong>v-bind</strong>绑定<code>&lt;a&gt;</code>标签的<code>href</code>属性，<code>href</code>属性的值将在data里面去寻找。</p><blockquote><p>注： <code>v-bind:href</code>可以缩写为<code>:href</code>；并且<code>v-bind</code>可以绑定任何属性</p></blockquote><h4 id="表达式"><a href="#表达式" class="headerlink" title="表达式"></a>表达式</h4><p>在双大括号标签中进行数据绑定时，标签中的内容可以是一个<strong>JavaScript表达式</strong>，示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><br>    &#123;&#123;number + 10 &#125;&#125;<span class="hljs-tag">&lt;<span class="hljs-name">br</span>&gt;</span><br>    &#123;&#123;boo ? &#x27;真的&#x27;:&#x27;假的&#x27;&#125;&#125;<span class="hljs-tag">&lt;<span class="hljs-name">br</span>&gt;</span><br>    &#123;&#123;str.toLowerCase()&#125;&#125;<br><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="javascript">    <span class="hljs-keyword">var</span> vm = <span class="hljs-keyword">new</span> Vue(&#123;</span><br><span class="javascript">        el: <span class="hljs-string">&#x27;#box&#x27;</span>,</span><br>        data: &#123;<br>            number: 10,<br><span class="javascript">            boo: <span class="hljs-literal">true</span>,</span><br><span class="javascript">            str: <span class="hljs-string">&#x27;MJH MY LOVE&#x27;</span></span><br>        &#125;<br>    &#125;);<br><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br></code></pre></td></tr></table></figure><blockquote><p>结果：20<br>真的<br>mjh my love</p></blockquote><h3 id="过滤器"><a href="#过滤器" class="headerlink" title="过滤器"></a>过滤器</h3><p>简单的表达式可能无法实现需要经过复杂计算的数据绑定，这时可以使用<strong>过滤器</strong>进行处理。</p><p>过滤器作用：自定义的过滤器可以对文本进行格式化</p><p>使用过滤器的两种方法： </p><ol><li>在双大括号插值标签中：<code>{{ message | myfilter }}</code>，第一个参数是绑定值，第二个参数是<strong>过滤器ID</strong>。</li><li>在v-bind指令中： <code>&lt;div v-bind:id=&quot;rawId | formatID&quot;&gt;&lt;/div&gt;</code></li></ol><p>定义过滤器的两种方法：</p><ol><li>使用全局方法**Vue.filter()**定义</li><li>使用选项对象中的<strong>filters</strong>选项定义</li></ol><h4 id="Vue-filter-定义全局过滤器"><a href="#Vue-filter-定义全局过滤器" class="headerlink" title="Vue.filter()定义全局过滤器"></a>Vue.filter()定义全局过滤器</h4><p><strong>使用全局方法Vue.filter()过滤器需要定义在创建Vue实例之前</strong></p><p><code>Vue.filter(&#39;ID&#39;,function(){})</code></p><p>第一个参数： 过滤器的ID，为自定义过滤器的唯一标识，使用<strong>单引号</strong>括起来</p><p>第二个参数： 具体的过滤器函数，此函数以表达式的值作为第一参数，再将接收到的参数格式化为想要的结果。</p><p>过滤器中的<code>function()</code>的第一个参数，已经被规定死了，永远都是 过滤器管道符前面 传递过来的数据。示例如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>&#123;&#123;date | nowdate&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="javascript">    Vue.filter(<span class="hljs-string">&#x27;nowdate&#x27;</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">value</span>) </span>&#123;</span><br><span class="javascript">        <span class="hljs-keyword">var</span> year = value.getFullYear();     <span class="hljs-comment">//当前年份</span></span><br><span class="javascript">        <span class="hljs-keyword">var</span> month = value.getMonth()+<span class="hljs-number">1</span>;     <span class="hljs-comment">//当前月份(索引从0开始所以+1)</span></span><br><span class="javascript">        <span class="hljs-keyword">var</span> date = value.getDate();         <span class="hljs-comment">//当前日</span></span><br><span class="javascript">        <span class="hljs-keyword">var</span> day = value.getDay();           <span class="hljs-comment">//当前星期(数字形式)</span></span><br><span class="javascript">        <span class="hljs-keyword">var</span> week = <span class="hljs-string">&quot;&quot;</span>;</span><br><span class="javascript">        <span class="hljs-keyword">switch</span> (day) &#123;</span><br><span class="javascript">            <span class="hljs-keyword">case</span> <span class="hljs-number">1</span>:</span><br><span class="javascript">                week = <span class="hljs-string">&quot;星期一&quot;</span>;</span><br><span class="javascript">                <span class="hljs-keyword">break</span>;</span><br><span class="javascript">            <span class="hljs-keyword">case</span> <span class="hljs-number">2</span>:</span><br><span class="javascript">                week = <span class="hljs-string">&quot;星期二&quot;</span>;</span><br><span class="javascript">                <span class="hljs-keyword">break</span>;</span><br><span class="javascript">            <span class="hljs-keyword">case</span> <span class="hljs-number">3</span>:</span><br><span class="javascript">                week = <span class="hljs-string">&quot;星期三&quot;</span>;</span><br><span class="javascript">                <span class="hljs-keyword">break</span>;</span><br><span class="javascript">            <span class="hljs-keyword">case</span> <span class="hljs-number">4</span>:</span><br><span class="javascript">                week = <span class="hljs-string">&quot;星期四&quot;</span>;</span><br><span class="javascript">                <span class="hljs-keyword">break</span>;</span><br><span class="javascript">            <span class="hljs-keyword">case</span> <span class="hljs-number">5</span>:</span><br><span class="javascript">                week = <span class="hljs-string">&quot;星期五&quot;</span>;</span><br><span class="javascript">                <span class="hljs-keyword">break</span>;</span><br><span class="javascript">            <span class="hljs-keyword">case</span> <span class="hljs-number">6</span>:</span><br><span class="javascript">                week = <span class="hljs-string">&quot;星期六&quot;</span>;</span><br><span class="javascript">                <span class="hljs-keyword">break</span>;</span><br><span class="javascript">            <span class="hljs-keyword">default</span>:</span><br><span class="javascript">                week = <span class="hljs-string">&quot;星期天&quot;</span>;</span><br><span class="javascript">                <span class="hljs-keyword">break</span>;</span><br>        &#125;<br><span class="javascript">        <span class="hljs-keyword">return</span> <span class="hljs-string">&quot;今天是：&quot;</span> + year + <span class="hljs-string">&quot;年&quot;</span> + month + <span class="hljs-string">&quot;月&quot;</span> + date + <span class="hljs-string">&quot;日&quot;</span> + week;</span><br>    &#125;);<br><span class="javascript">    <span class="hljs-keyword">var</span> vm = <span class="hljs-keyword">new</span> Vue(&#123;</span><br><span class="javascript">        el: <span class="hljs-string">&#x27;#box&#x27;</span>,</span><br>        data: &#123;<br><span class="javascript">            date: <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>()</span><br>        &#125;<br>    &#125;);<br><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br></code></pre></td></tr></table></figure><blockquote><p>注：Vue.filter()里的过滤器ID需要<strong>单引号</strong>包括起来；里面每一句写完用分号<code>;</code>结束</p></blockquote><h4 id="filters定义本地过滤器"><a href="#filters定义本地过滤器" class="headerlink" title="filters定义本地过滤器"></a>filters定义本地过滤器</h4><ul><li>在filters定义的过滤器包括<strong>过滤器名称</strong>和<strong>过滤器函数</strong>两部分，其中<strong>过滤器函数</strong>以表达式的值作为第一个参数。示例如下：</li></ul><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span><br>        <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>[特惠]<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>&#123;&#123;title1 | subStr&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span><br>        <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>[公告]<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>&#123;&#123;title2 | subStr&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span><br>        <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>[特惠]<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>&#123;&#123;title3 | subStr&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span><br>        <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>[公告]<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>&#123;&#123;title4 | subStr&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span><br>        <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>[特惠]<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>&#123;&#123;title5 | subStr&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span><br>    <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="javascript">    <span class="hljs-keyword">var</span> vm = <span class="hljs-keyword">new</span> Vue(&#123;</span><br><span class="javascript">        el: <span class="hljs-string">&#x27;#box&#x27;</span>,</span><br>        data: &#123;<br><span class="javascript">            title1: <span class="hljs-string">&#x27;商城爆品1分秒杀&#x27;</span>,</span><br><span class="javascript">            title2: <span class="hljs-string">&#x27;商城与长春市签署战略合作协议&#x27;</span>,</span><br><span class="javascript">            title3: <span class="hljs-string">&#x27;洋河年末大促，低至两件五折&#x27;</span>,</span><br><span class="javascript">            title4: <span class="hljs-string">&#x27;华北、华中部分地区配送延迟&#x27;</span>,</span><br><span class="javascript">            title5: <span class="hljs-string">&#x27;家电狂欢千亿礼券 买1送1!&#x27;</span>,</span><br>        &#125;,<br>        filters: &#123;<br><span class="javascript">            subStr: <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">value</span>) </span>&#123;</span><br>                if (value.length &gt; 10) &#123;<br><span class="javascript">                    <span class="hljs-keyword">return</span> value.substr(<span class="hljs-number">0</span>, <span class="hljs-number">10</span>) + <span class="hljs-string">&quot;...&quot;</span>;</span><br><span class="javascript">                &#125; <span class="hljs-keyword">else</span> &#123;</span><br><span class="javascript">                    <span class="hljs-keyword">return</span> value;</span><br>                &#125;<br><br>            &#125;<br>        &#125;,<br>    &#125;);<br><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br></code></pre></td></tr></table></figure><ul><li><p>多个过滤器可以串联使用，格式如下:<br><code>{{message | filterA | fileterB}}</code><br>首先message的值作为参数去执行filterA过滤器的规则，完成之后的结果作为参数再去执行filterB</p></li><li><p>过滤器实质是一个函数，所以也可以<strong>接受额外的参数</strong>，格式如下：<br><code>{{message | filterA(arg1, arg2)}}</code><br>message的值作为第1个参数，arg1为第2个参数，arg2为第3个参数传递刚给过滤器filterA，示例如下：</p></li></ul><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><br>    <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>&#123;&#123;price | formatPrice(&#x27;$&#x27;)&#125;&#125;<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text/javascript&quot;</span>&gt;</span><br><span class="javascript">    <span class="hljs-keyword">var</span> vm = <span class="hljs-keyword">new</span> Vue(&#123;</span><br><span class="javascript">        el : <span class="hljs-string">&#x27;#box&#x27;</span>,</span><br>        data : &#123;<br>            price : 199,<br>        &#125;,<br>        filters : &#123;<br><span class="javascript">            formatPrice : <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">value,symbol</span>) </span>&#123;</span><br><span class="javascript">                <span class="hljs-keyword">return</span> symbol + value.toFixed(<span class="hljs-number">2</span>) <span class="hljs-comment">//保留两位小数</span></span><br>            &#125;<br>        &#125;,<br>    &#125;);<br><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span><br></code></pre></td></tr></table></figure><h4 id="指令"><a href="#指令" class="headerlink" title="指令"></a>指令</h4><ul><li>绑定表达式：放在双大括号标签内的文本称为绑定表达式</li><li>指令是带有v-前缀的特殊属性，指令的值限定为<strong>绑定表达式</strong></li><li>指令用于在绑定表达式的值发生改变时，将这种数据的变化应用到DOM上。以上三条示例如下：<br><code>&lt;p v-if=&quot;show&quot;&gt;ifunan&lt;/p&gt;</code></li></ul><p>还有一些指令语法略有不同，能接收参数和修饰符</p><ol><li><p>参数<br>如v-bind指令、v-on指令能够接收一个参数。该参数位于<strong>指令</strong>和<strong>表达式</strong>之间，<strong>并用冒号分隔</strong><br>v-bind指令示例如下：<br><code>&lt;img v-bind:src=&quot;imageSrc&quot;&gt;</code><br>上述示例中，src即为<strong>参数</strong>，imageSrc即为<strong>表达式</strong>，通过v-bind指令将<code>&lt;img&gt;</code>元素的src属性与表达式imageSrc的值进行绑定</p></li><li><p>修饰符<br>修饰符是在参数后面，以<strong>半角句点符号</strong>指明的特殊后缀。示例如下：<br><code>&lt;form v-on:submit.prevent=&quot;onSubmit&quot;&gt;&lt;/form&gt;</code><br>上述示例中，当提交表单时会调用event.preventDefault()方法阻止浏览器默认行为。</p></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简介&quot;&gt;&lt;a href=&quot;#简介&quot; class=&quot;headerlink&quot; title=&quot;简介&quot;&gt;&lt;/a&gt;简介&lt;/h1&gt;&lt;figure class=&quot;highlight html&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span c</summary>
      
    
    
    
    <category term="Vue前端开发" scheme="http://www.ifunan.cn/categories/Vue%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Vue" scheme="http://www.ifunan.cn/tags/Vue/"/>
    
  </entry>
  
  <entry>
    <title>Docker(七)Kubernetes基础</title>
    <link href="http://www.ifunan.cn/posts/8481a3fc/"/>
    <id>http://www.ifunan.cn/posts/8481a3fc/</id>
    <published>2020-10-23T03:25:39.000Z</published>
    <updated>2020-10-23T03:25:43.315Z</updated>
    
    <content type="html"><![CDATA[<h1 id="kubernetes基础"><a href="#kubernetes基础" class="headerlink" title="kubernetes基础"></a>kubernetes基础</h1><h2 id="写在前面"><a href="#写在前面" class="headerlink" title="写在前面"></a>写在前面</h2><p>Rancher镜像分为两种:<br>Rancher1.X：镜像名为rancher/server<br>Rancher2.X：镜像名为rancher/rancher<br>此教程使用<code>Rancher2.X</code>，镜像<code>rancher/rancher</code></p><h2 id="实验准备"><a href="#实验准备" class="headerlink" title="实验准备"></a>实验准备</h2><p>两种方法：<br>方法一： 一台全新的虚拟机，并完成<a href="http://www.ifunan.cn/posts/4533a720/">Docker(一)安装</a><br>方法二： 如果有项目一的快照，则不需要新建虚拟机,克隆快照后修改IP地址即可</p><p>克隆快照方法：</p><ol><li>打开快照编辑器，选择快照并开始克隆<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/15/0oLXUU.png"></li><li>进入后选择需要克隆的快照<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/15/0oLj5F.png"></li><li>选择链接克隆<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/15/0oLOET.png"></li><li>指定克隆后的虚拟机名称以及克隆虚拟机的存储位置，完成克隆<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/15/0oLqbV.png"></li><li>克隆完成后进入<strong>修改IP地址</strong></li></ol><h2 id="关闭防火墙及SeLinux"><a href="#关闭防火墙及SeLinux" class="headerlink" title="关闭防火墙及SeLinux"></a>关闭防火墙及SeLinux</h2><ol><li>关闭SELinux<br><code>sed -i &#39;s/SELINUX=.*/SELINUX=disabled/g&#39; /etc/selinux/config</code><br><code>setenforce 0</code></li><li>关闭防火墙及防火墙的开机自启动<br><code>systemctl stop firewalld.service</code><br><code>systemctl disable firewalld.service</code></li></ol><h2 id="Rancher安装与配置"><a href="#Rancher安装与配置" class="headerlink" title="Rancher安装与配置"></a>Rancher安装与配置</h2><ol><li>更改IP后需重启Docker<br><code>systemctl restart docker.service</code></li><li>Pull Rancher镜像到本地<br><code>docker pull rancher/rancher</code></li><li>运行Rancher<br><code>docker run -d --restart=unless-stopped --privileged -p 80:80 -p 443:443 rancher/rancher</code><blockquote><p>在Kubernetes之外运行时，必须使用–privileged标志运行Rancher</p></blockquote></li><li>浏览器输入IP地址访问Rancher，首次登录需修改密码<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/23/BkXAUA.png" alt="27"><br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/23/BkXE4I.png" alt="28"></li><li>进入后可将界面设置为中文<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/23/BkXZCt.png" alt="29"></li></ol><h2 id="Kubectl安装与配置"><a href="#Kubectl安装与配置" class="headerlink" title="Kubectl安装与配置"></a>Kubectl安装与配置</h2><h3 id="添加集群"><a href="#添加集群" class="headerlink" title="添加集群"></a>添加集群</h3><ol><li>点击全局——添加集群<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/23/BkXe8P.png" alt="30"></li><li>选择从现有节点添加K8S<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/23/BkXSgK.png" alt="31"></li><li>填写集群名称<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/23/BkOz36.png" alt="32"></li><li>展开Kubernetes选项，将云提供商设置为无，完成后点击下一步<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/23/BkXCuD.png" alt="33"></li><li>将角色选择的三个角色全选上，并点开<strong>高级选项</strong>填写内网地址(即本机的IP地址)，然后复制下方的命令并复制到Centos执行，完成后下方会弹出新主机注册成功<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/23/BkXPDe.png" alt="34"></li><li>点击完成后等待集群状态变为Active(注：此过程耗时较长,可能会在pull images时卡很久,全程可能会超过半小时)<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/23/BkXpjO.png" alt="35"></li></ol><h3 id="集群相关操作"><a href="#集群相关操作" class="headerlink" title="集群相关操作"></a>集群相关操作</h3><ol><li>点击集群查看集群状态<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/23/BkXkEd.png" alt="36"></li><li>点击<strong>执行kubectl命令行</strong>按钮，可使用命令行查看集群信息<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/23/BkXiHH.png" alt="37"></li></ol><h2 id="扩展"><a href="#扩展" class="headerlink" title="扩展"></a>扩展</h2><ol><li>查看某个容器日志<br><code>docker logs Name/ID</code></li><li>读取docker容器日志的后一千行信息<br><code>docker logs -f --tail=1000 Name/ID</code></li><li>docker启动所有的容器<br><code>docker start $(docker ps -a | awk &#39;&#123; print $1&#125;&#39; | tail -n +2)</code></li><li>docker关闭所有的容器<br><code>docker stop $(docker ps -a | awk &#39;&#123; print $1&#125;&#39; | tail -n +2)</code></li></ol><h2 id="相关链接"><a href="#相关链接" class="headerlink" title="相关链接"></a>相关链接</h2><p>Rancher 1.X(rancher/server)安装k8s教程：<a href="https://blog.csdn.net/qqqqll3/article/details/90635154">https://blog.csdn.net/qqqqll3/article/details/90635154</a><br>Rancher 2.X(rancher/rancher)安装k8s教程：<a href="https://blog.csdn.net/miss1181248983/article/details/87970338">https://blog.csdn.net/miss1181248983/article/details/87970338</a><br>kubectl常用命令：<a href="https://www.cnblogs.com/miclesvic/articles/10997060.html">https://www.cnblogs.com/miclesvic/articles/10997060.html</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;kubernetes基础&quot;&gt;&lt;a href=&quot;#kubernetes基础&quot; class=&quot;headerlink&quot; title=&quot;kubernetes基础&quot;&gt;&lt;/a&gt;kubernetes基础&lt;/h1&gt;&lt;h2 id=&quot;写在前面&quot;&gt;&lt;a href=&quot;#写在前面&quot; cla</summary>
      
    
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/categories/Docker/"/>
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker(五)容器相关技术</title>
    <link href="http://www.ifunan.cn/posts/a7347212/"/>
    <id>http://www.ifunan.cn/posts/a7347212/</id>
    <published>2020-10-14T15:46:42.000Z</published>
    <updated>2020-10-15T08:16:57.890Z</updated>
    
    <content type="html"><![CDATA[<h1 id="容器相关技术"><a href="#容器相关技术" class="headerlink" title="容器相关技术"></a>容器相关技术</h1><h2 id="Harbor查看镜像安全"><a href="#Harbor查看镜像安全" class="headerlink" title="Harbor查看镜像安全"></a>Harbor查看镜像安全</h2><h3 id="添加扫描模块"><a href="#添加扫描模块" class="headerlink" title="添加扫描模块"></a>添加扫描模块</h3><ol><li>进入Harbor安装目录<br><code>cd /root/harbor/</code></li><li>添加扫描模块<br><code>./prepare --with-clair</code></li><li>重启Harbor服务<br><code>docker-compose -f docker-compose.yml up -d</code></li><li>所需条件：需在Harbor创建一个项目并上传镜像到Harbor</li></ol><h3 id="Harbor扫描漏洞"><a href="#Harbor扫描漏洞" class="headerlink" title="Harbor扫描漏洞"></a>Harbor扫描漏洞</h3><ol><li>浏览器点击审查服务可看见刚刚添加的扫描器<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/10/0sRpRO.png"></li><li>点击漏洞——扫描，可扫描所有镜像<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/10/0sRSJK.png"></li><li>选择一个自建的项目——镜像仓库——点击一个镜像——选中镜像——扫描，可扫描指定镜像<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/10/0s2zi6.png"></li></ol><h3 id="Harbor查看Docker-layers"><a href="#Harbor查看Docker-layers" class="headerlink" title="Harbor查看Docker layers"></a>Harbor查看Docker layers</h3><p>项目——进入一个项目——进入一个镜像——查看镜像详细信息——点击构建历史<br>命令下方每一行即为Docker的每一layer<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/14/0ILLef.png"></p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p>Harbor镜像漏洞扫描：<a href="https://www.cnblogs.com/Dev0ps/p/12401615.html">https://www.cnblogs.com/Dev0ps/p/12401615.html</a><br>Harbor搭建与使用,配置漏洞扫描：<a href="https://blog.csdn.net/weixin_42851117/article/details/106682628">https://blog.csdn.net/weixin_42851117/article/details/106682628</a><br>Harbor使用：<a href="https://www.cnblogs.com/adjk/p/11043856.html">https://www.cnblogs.com/adjk/p/11043856.html</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;容器相关技术&quot;&gt;&lt;a href=&quot;#容器相关技术&quot; class=&quot;headerlink&quot; title=&quot;容器相关技术&quot;&gt;&lt;/a&gt;容器相关技术&lt;/h1&gt;&lt;h2 id=&quot;Harbor查看镜像安全&quot;&gt;&lt;a href=&quot;#Harbor查看镜像安全&quot; class=&quot;head</summary>
      
    
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/categories/Docker/"/>
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker(四)容器存储和网络基础(新建虚拟机版)</title>
    <link href="http://www.ifunan.cn/posts/924dfae8/"/>
    <id>http://www.ifunan.cn/posts/924dfae8/</id>
    <published>2020-10-05T14:17:59.000Z</published>
    <updated>2020-10-23T03:21:09.968Z</updated>
    
    <content type="html"><![CDATA[<h1 id="容器存储和网络基础-新建虚拟机版"><a href="#容器存储和网络基础-新建虚拟机版" class="headerlink" title="容器存储和网络基础(新建虚拟机版)"></a>容器存储和网络基础(新建虚拟机版)</h1><h2 id="实验准备"><a href="#实验准备" class="headerlink" title="实验准备"></a>实验准备</h2><p>两种方法：<br>方法一： 一台全新的虚拟机，并完成<a href="http://www.ifunan.cn/posts/4533a720/">Docker(一)安装</a><br>方法二： 如果有项目一的快照，则不需要新建虚拟机,克隆快照后修改IP地址即可</p><p>克隆快照方法：</p><ol><li>打开快照编辑器，选择快照并开始克隆<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/15/0oLXUU.png"></li><li>进入后选择需要克隆的快照<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/15/0oLj5F.png"></li><li>选择链接克隆<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/15/0oLOET.png"></li><li>指定克隆后的虚拟机名称以及克隆虚拟机的存储位置，完成克隆<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/15/0oLqbV.png"></li><li>克隆完成后进入<strong>修改IP地址</strong></li></ol><h2 id="关闭防火墙及SeLinux"><a href="#关闭防火墙及SeLinux" class="headerlink" title="关闭防火墙及SeLinux"></a>关闭防火墙及SeLinux</h2><ol><li>关闭SELinux<br><code>sed -i &#39;s/SELINUX=.*/SELINUX=disabled/g&#39; /etc/selinux/config</code><br><code>setenforce 0</code></li><li>关闭防火墙及防火墙的开机自启动<br><code>systemctl stop firewalld.service</code><br><code>systemctl disable firewalld.service</code></li></ol><h2 id="Docker-compose编排工具"><a href="#Docker-compose编排工具" class="headerlink" title="Docker-compose编排工具"></a>Docker-compose编排工具</h2><ol><li>安装Docker编排工具docker-compose(Harbor依赖该服务)<br><code>yum -y install epel-release.noarch</code><br><code>yum makecache fast</code><br><code>yum -y install docker-compose.noarch</code></li></ol><h2 id="Docker-compose部署GitLab"><a href="#Docker-compose部署GitLab" class="headerlink" title="Docker-compose部署GitLab"></a>Docker-compose部署GitLab</h2><ol><li>新建gitlab安装目录<br><code>mkdir /usr/local/gitlab/</code><br><code>cd /usr/local/gitlab/</code></li><li>新建配置文件<br><code>vi docker-compose.yml</code>并添加以下内容(注意IP改为你的IP和配置项的缩进格式)<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">version: &#39;3&#39;</span><br><span class="line">services:</span><br><span class="line">  web:</span><br><span class="line">    image: &#39;twang2218&#x2F;gitlab-ce-zh&#39;</span><br><span class="line">    restart: always</span><br><span class="line">    hostname: &#39;IP地址&#39;</span><br><span class="line">    environment:</span><br><span class="line">      TZ: &#39;Asia&#x2F;Shanghai&#39;</span><br><span class="line">      GITLAB_OMNIBUS_CONFIG: |</span><br><span class="line">        external_url &#39;http:&#x2F;&#x2F;IP地址&#39;</span><br><span class="line">        gitlab_rails[&#39;gitlab_shell_ssh_port&#39;] &#x3D; 2222</span><br><span class="line">        unicorn[&#39;port&#39;] &#x3D; 8888</span><br><span class="line">        nginx[&#39;listen_port&#39;] &#x3D; 80</span><br><span class="line">    ports:</span><br><span class="line">      - &#39;80:80&#39;</span><br><span class="line">      - &#39;8443:443&#39;</span><br><span class="line">      - &#39;2222:22&#39;        </span><br><span class="line">    volumes:    </span><br><span class="line">      - .&#x2F;config:&#x2F;etc&#x2F;gitlab</span><br><span class="line">      - .&#x2F;data:&#x2F;var&#x2F;opt&#x2F;gitlab</span><br><span class="line">      - .&#x2F;logs:&#x2F;var&#x2F;log&#x2F;gitlab</span><br></pre></td></tr></table></figure></li><li>创建gitlab所需使用的相关目录(此步骤可忽略，也可将上边配置文件的volumes选项修改为此路径)<br><code>mkdir /opt/gitlab/&#123;config,data,logs&#125; -p</code></li><li>拉取gitlab中文版镜像<br><code>docker pull twang2218/gitlab-ce-zh</code></li><li>查看镜像是否拉取成功<br><code>docker images</code></li><li>重启Docker<br><code>systemctl restart docker.service</code></li><li>启动gitlab的容器<br><code>docker-compose up -d</code></li><li>查看容器是否正常运行<br><code>docker ps -a</code><br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tMmoq.png"></li></ol><h2 id="GitLab相关操作"><a href="#GitLab相关操作" class="headerlink" title="GitLab相关操作"></a>GitLab相关操作</h2><h3 id="GitLab创建项目"><a href="#GitLab创建项目" class="headerlink" title="GitLab创建项目"></a>GitLab创建项目</h3><ol><li>浏览器输入<code>http://IP地址</code>,第一次访问需设置密码(账户名：root)<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tMuF0.png"></li><li>新建一个项目,项目名称随意填写，设置好后点击<code>create project</code>创建项目<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tM1lF.png"><br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tMKYV.png"></li><li>创建好项目后如下图所示，点击按钮复制项目ssh地址，之后会用到<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tMlSU.png"></li></ol><h3 id="添加密钥"><a href="#添加密钥" class="headerlink" title="添加密钥"></a>添加密钥</h3><ol><li>在Linux中生成密钥(输入命令后三次回车)<br><code>ssh-keygen</code></li><li>进入文件复制ssh密钥<br><code>vi /root/.ssh/id_rsa.pub</code></li><li>回到浏览器点击右边的头像——设置<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tM3y4.png"></li><li>将复制的密钥添加到gitlab中,点击<code>Add key</code>添加密钥<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tMJm9.png"></li></ol><h3 id="Git上传代码到Gitlab仓库"><a href="#Git上传代码到Gitlab仓库" class="headerlink" title="Git上传代码到Gitlab仓库"></a>Git上传代码到Gitlab仓库</h3><ol><li><p>移动到任意一个目录下，克隆远程仓库到本地,仓库地址为上边复制过的SSH地址<br><code>cd /root</code><br><code>git clone 你的仓库地址</code><br><code>cd 仓库名称</code></p></li><li><p>添加git账户<br><code>git config --global user.name &quot;自定义账户名&quot;</code></p><blockquote><p>例：<code>git config --global user.name &quot;root&quot;</code></p></blockquote></li><li><p>添加git邮箱<br><code>git config --global user.email &quot;你的邮箱&quot;</code></p><blockquote><p>例：<code>git config --global user.email &quot;1186174184@qq.com&quot;</code></p></blockquote></li><li><p>上传代码到GitLab(操作与Windows里上传到Github操作一样),以下操作省略详细步骤<br><code>git add .</code><br><code>git commit -m &quot;1.0.0&quot;</code><br><code>git push origin master</code></p></li><li><p>推送代码后再次查看浏览器上的GitLab仓库,可看见上传成功的结果</p></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;容器存储和网络基础-新建虚拟机版&quot;&gt;&lt;a href=&quot;#容器存储和网络基础-新建虚拟机版&quot; class=&quot;headerlink&quot; title=&quot;容器存储和网络基础(新建虚拟机版)&quot;&gt;&lt;/a&gt;容器存储和网络基础(新建虚拟机版)&lt;/h1&gt;&lt;h2 id=&quot;实验准备&quot;&gt;&lt;</summary>
      
    
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/categories/Docker/"/>
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker(四)容器存储和网络基础(修改端口版)</title>
    <link href="http://www.ifunan.cn/posts/f125ee8b/"/>
    <id>http://www.ifunan.cn/posts/f125ee8b/</id>
    <published>2020-10-05T14:07:59.000Z</published>
    <updated>2020-10-15T08:16:57.888Z</updated>
    
    <content type="html"><![CDATA[<h1 id="写在开始"><a href="#写在开始" class="headerlink" title="写在开始"></a>写在开始</h1><p>此实验将Harbor和GitLab装在了同一台虚拟机中，虽然修改了GitLab的端口，但经实验因个体差异导致某些电脑修改端口后GitLab也无法启动，故有了第二篇文档：<a href="http://www.ifunan.cn/2020/10/05/Docker_%E5%AE%B9%E5%99%A8%E5%AD%98%E5%82%A8%E5%92%8C%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%8002/">容器存储和网络基础(新建虚拟机版)</a><br>第二篇文档将GitLab独立出来，解决了Harbor和GitLab的端口问题，请根据自身情况选择合适的方案</p><h1 id="容器存储和网络基础-修改端口版"><a href="#容器存储和网络基础-修改端口版" class="headerlink" title="容器存储和网络基础(修改端口版)"></a>容器存储和网络基础(修改端口版)</h1><h2 id="开启Harbor"><a href="#开启Harbor" class="headerlink" title="开启Harbor"></a>开启Harbor</h2><ol><li>关闭SELinux<br><code>sed -i &#39;s/SELINUX=.*/SELINUX=disabled/g&#39; /etc/selinux/config</code><br><code>setenforce 0</code></li><li>进入Harbor的安装目录下<br><code>cd /root/harbor/</code></li><li>虚拟机重启后需要手动开启Harbor<br><code>docker-compose start</code></li><li>或者可以设置Harbor为开机自启动<br><code>vi harbor.service </code>在文件中添加以下内容：<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description&#x3D;Redis</span><br><span class="line">After&#x3D;network.target</span><br><span class="line">[Service]</span><br><span class="line">ExecStart&#x3D; &#x2F;usr&#x2F;bin&#x2F;docker-compose start</span><br><span class="line">[Install]</span><br><span class="line">WantedBy&#x3D;multi-user.target</span><br></pre></td></tr></table></figure></li></ol><h2 id="Docker-compose部署GitLab"><a href="#Docker-compose部署GitLab" class="headerlink" title="Docker-compose部署GitLab"></a>Docker-compose部署GitLab</h2><ol><li>新建gitlab安装目录<br><code>mkdir /usr/local/gitlab/</code><br><code>cd /usr/local/gitlab/</code></li><li>新建配置文件<br><code>vi docker-compose.yml</code>并添加以下内容(注意IP改为你的IP和配置项的缩进格式)<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">version: &#39;3&#39;</span><br><span class="line">services:</span><br><span class="line">  web:</span><br><span class="line">    image: &#39;twang2218&#x2F;gitlab-ce-zh&#39;</span><br><span class="line">    restart: always</span><br><span class="line">    hostname: &#39;192.168.200.120&#39;</span><br><span class="line">    environment:</span><br><span class="line">      TZ: &#39;Asia&#x2F;Shanghai&#39;</span><br><span class="line">      GITLAB_OMNIBUS_CONFIG: |</span><br><span class="line">        external_url &#39;http:&#x2F;&#x2F;192.168.200.120:82&#39;</span><br><span class="line">        gitlab_rails[&#39;gitlab_shell_ssh_port&#39;] &#x3D; 2222</span><br><span class="line">        unicorn[&#39;port&#39;] &#x3D; 8888</span><br><span class="line">        nginx[&#39;listen_port&#39;] &#x3D; 82</span><br><span class="line">    ports:</span><br><span class="line">      - &#39;82:82&#39;</span><br><span class="line">      - &#39;8443:443&#39;</span><br><span class="line">      - &#39;2222:22&#39;        </span><br><span class="line">    volumes:    </span><br><span class="line">      - .&#x2F;config:&#x2F;etc&#x2F;gitlab</span><br><span class="line">      - .&#x2F;data:&#x2F;var&#x2F;opt&#x2F;gitlab</span><br><span class="line">      - .&#x2F;logs:&#x2F;var&#x2F;log&#x2F;gitlab</span><br></pre></td></tr></table></figure><blockquote><p>注：此处因为将Harbor和GitLab装在了同一台服务器上，为避免端口冲突，所以将GitLab的Http端口设置为82。如果82端口不行，改为8181</p></blockquote></li></ol><p><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/06/0U3vPs.png"><br>3. 创建gitlab所需使用的相关目录(此步骤可忽略，也可将上边配置文件的volumes选项修改为此路径)<br><code>mkdir /opt/gitlab/&#123;config,data,logs&#125; -p</code><br>4. 拉取gitlab中文版镜像<br><code>docker pull twang2218/gitlab-ce-zh</code><br>5. 查看镜像是否拉取成功<br><code>docker images</code><br>6. 启动gitlab的容器<br><code>docker-compose up -d</code><br>7. 查看容器是否正常运行<br><code>docker ps -a</code><br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tMmoq.png"><br>8. 设置gitlab开机启动(第二句echo需设置成你自己的安装目录下)<br><code>chmod +x /etc/rc.local</code><br><code>echo &quot;cd /usr/local/gitlab &amp;&amp; docker-compose up -d&quot; &gt;&gt; /etc/rc.local</code></p><h2 id="GitLab相关操作"><a href="#GitLab相关操作" class="headerlink" title="GitLab相关操作"></a>GitLab相关操作</h2><h3 id="GitLab创建项目"><a href="#GitLab创建项目" class="headerlink" title="GitLab创建项目"></a>GitLab创建项目</h3><ol><li>浏览器输入<code>http://IP地址:82</code>,第一次访问需设置密码(账户名：root,且此处需要指定端口号为82)<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tMuF0.png"></li><li>新建一个项目,项目名称随意填写，设置好后点击<code>create project</code>创建项目<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tM1lF.png"><br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tMKYV.png"></li><li>创建好项目后如下图所示，点击按钮复制项目ssh地址，之后会用到<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tMlSU.png"></li></ol><h3 id="添加密钥"><a href="#添加密钥" class="headerlink" title="添加密钥"></a>添加密钥</h3><ol><li>在Linux中生成密钥(输入命令后三次回车)<br><code>ssh-keygen</code></li><li>进入文件复制ssh密钥<br><code>vi /root/.ssh/id_rsa.pub</code></li><li>回到浏览器点击右边的头像——设置<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tM3y4.png"></li><li>将复制的密钥添加到gitlab中,点击<code>Add key</code>添加密钥<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/10/05/0tMJm9.png"></li></ol><h3 id="Git上传代码到Gitlab仓库"><a href="#Git上传代码到Gitlab仓库" class="headerlink" title="Git上传代码到Gitlab仓库"></a>Git上传代码到Gitlab仓库</h3><ol><li><p>移动到任意一个目录下，克隆远程仓库到本地,仓库地址为上边复制过的SSH地址<br><code>cd /root</code><br><code>git clone 你的仓库地址</code><br><code>cd 仓库名称</code></p></li><li><p>添加git账户<br><code>git config --global user.name &quot;自定义账户名&quot;</code></p><blockquote><p>例：<code>git config --global user.name &quot;root&quot;</code></p></blockquote></li><li><p>添加git邮箱<br><code>git config --global user.email &quot;你的邮箱&quot;</code></p><blockquote><p>例：<code>git config --global user.email &quot;1186174184@qq.com&quot;</code></p></blockquote></li><li><p>上传代码到GitLab(操作与Windows里上传到Github操作一样),以下操作省略详细步骤<br><code>git add .</code><br><code>git commit -m &quot;1.0.0&quot;</code><br><code>git push origin master</code></p></li><li><p>推送代码后再次查看浏览器上的GitLab仓库,可看见上传成功的结果</p></li></ol><h2 id="扩展"><a href="#扩展" class="headerlink" title="扩展"></a>扩展</h2><p>重启服务器后启动Gitlab</p><ol><li>进入Gitlab的安装目录下<br><code>cd /usr/local/gitlab/</code></li><li>启动Gitlab<br><code>docker-compose up -d</code></li><li>可使用lsof查看端口占用情况<br><code>lsof -i :80</code></li><li>导出镜像<br><code>docker save 镜像ID &gt; 导出的名称.tar</code></li><li>导入镜像<br><code>docker load -i twang2218-gitlab-ce-zh.tar</code></li><li>修改镜像名称<br><code>docker tag 镜像ID 修改后ID</code></li><li>停止创建的容器<br><code>docker-compose stop</code></li><li>重启当前目录下的容器<br><code>docker-compose -f docker-compose.yml up -d</code></li><li>删除容器<br><code>docker rm 选项 容器ID</code><blockquote><p>-f :强制删除一个运行中的容器</p></blockquote></li></ol><p>-l :移除容器间的网络连接，而非容器本身<br>-v :删除与容器关联的卷</p><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><p>Docker-compose部署gitlab中文版：<a href="https://www.cnblogs.com/linuxk/p/10100431.html#2%E3%80%81%E5%AE%89%E8%A3%85docker-compose">https://www.cnblogs.com/linuxk/p/10100431.html#2%E3%80%81%E5%AE%89%E8%A3%85docker-compose</a><br>Docker-compose安装GitLab：<a href="https://blog.csdn.net/weixin_44155097/article/details/102550036">https://blog.csdn.net/weixin_44155097/article/details/102550036</a><br>Git相关命令：<a href="https://www.cnblogs.com/wwtao/p/12019190.html">https://www.cnblogs.com/wwtao/p/12019190.html</a><br>GitLab使用自定义端口01：<a href="https://blog.csdn.net/shan165310175/article/details/92797199">https://blog.csdn.net/shan165310175/article/details/92797199</a><br>GitLab使用自定义端口02：<a href="https://blog.csdn.net/qq_37171817/article/details/107791947">https://blog.csdn.net/qq_37171817/article/details/107791947</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;写在开始&quot;&gt;&lt;a href=&quot;#写在开始&quot; class=&quot;headerlink&quot; title=&quot;写在开始&quot;&gt;&lt;/a&gt;写在开始&lt;/h1&gt;&lt;p&gt;此实验将Harbor和GitLab装在了同一台虚拟机中，虽然修改了GitLab的端口，但经实验因个体差异导致某些电脑修改端口</summary>
      
    
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/categories/Docker/"/>
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker(三)应用容器化</title>
    <link href="http://www.ifunan.cn/posts/6f33d2a6/"/>
    <id>http://www.ifunan.cn/posts/6f33d2a6/</id>
    <published>2020-09-24T00:26:57.000Z</published>
    <updated>2020-10-15T08:16:57.892Z</updated>
    
    <content type="html"><![CDATA[<h1 id="应用容器化"><a href="#应用容器化" class="headerlink" title="应用容器化"></a>应用容器化</h1><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><ol><li><p>安装Docker编排工具docker-compose(Harbor依赖该服务)<br><code>yum -y install epel-release.noarch</code><br><code>yum makecache fast</code><br><code>yum -y install docker-compose.noarch</code></p></li><li><p>解压harbor安装包(将包传至目录后再解压)<br><code>tar -zxvf harbor-offline-installer-v2.0.1.tgz</code></p></li><li><p>关闭防火墙和Selinux<br><code>systemctl stop firewalld.service</code><br><code>setenforce 0</code></p></li><li><p>关闭防火墙后需要重启docker，不然会报错<br><code>systemctl restart docker.service</code></p></li></ol><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><ol><li>进入目录<br><code>cd harbor/</code></li><li>备份主配置文件<br><code>cp harbor.yml.tmpl harbor.yml</code></li><li>进入配置文件(将文件里的<code>hostname</code>值修改为<code>hostname: 你的IP地址</code>)<br><code>vi harbor.yml</code></li><li>注释掉https相关的内容,全部配置如下图所示<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/23/wxdTSA.png"></li><li>保存修改后安装Harbor服务<br><code>./install.sh</code></li><li>查看Harbor的状态<br><code>docker-compose ps</code></li><li>在浏览器访问,<code>http://你的IP地址</code>,默认账号admin,密码Harbor12345<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/23/wxw7h4.png"></li></ol><h2 id="Harbor操作"><a href="#Harbor操作" class="headerlink" title="Harbor操作"></a>Harbor操作</h2><ol><li>进入网页后新建一个项目<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/23/wxB6Qs.png"></li><li>修改docker配置文件,添加以下内容(注意红圈处有一个逗号)<br><code>vi /etc/docker/daemon.json</code><br><code>&quot;insecure-registries&quot;:[&quot;你的ip地址&quot;]</code><br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/24/0SSXP1.png"></li><li>重启docker<br><code>systemctl restart docker</code></li><li>登录自建的Harbor镜像仓库(账号密码为登录网页的密码)<br><code>docker login 你的IP地址</code></li><li>使用tag更改一个镜像<br><code>docker tag choerodon/cibase:latest 你的IP地址/刚才新建项目的名称/choerodon</code><blockquote><p>例子：<code>docker tag choerodon/cibase:latest 192.168.200.120/test/choerodon</code></p></blockquote></li><li>将镜像推送到仓库<br><code>docker push 你的IP地址/刚才新建项目的名称/choerodon</code><blockquote><p>例子：<code>docker push 192.168.200.120/test/choerodon</code></p></blockquote></li><li>下载镜像<br><code>docker pull 你的IP地址/刚才新建项目的名称/choerodon:latest</code><blockquote><p>例子：<code>docker pull 192.168.200.120/test/choerodon:latest</code></p></blockquote></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;应用容器化&quot;&gt;&lt;a href=&quot;#应用容器化&quot; class=&quot;headerlink&quot; title=&quot;应用容器化&quot;&gt;&lt;/a&gt;应用容器化&lt;/h1&gt;&lt;h2 id=&quot;安装&quot;&gt;&lt;a href=&quot;#安装&quot; class=&quot;headerlink&quot; title=&quot;安装&quot;&gt;&lt;/a&gt;安</summary>
      
    
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/categories/Docker/"/>
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker(二)常用操作</title>
    <link href="http://www.ifunan.cn/posts/12cd49f3/"/>
    <id>http://www.ifunan.cn/posts/12cd49f3/</id>
    <published>2020-09-16T16:11:23.000Z</published>
    <updated>2020-10-15T08:16:57.890Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Docker常用操作"><a href="#Docker常用操作" class="headerlink" title="Docker常用操作"></a>Docker常用操作</h1><p>1、查询docker镜像<br><code>docker search choerodon/cibase</code><br>参数说明:<br>-s 10：列出收藏数不小于10的镜像<br>–no-trunc：显示完整镜像描述<br>–automated：只列出automated build类型的镜像<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/16/w2bnsS.jpg"><br>例2：查询nginx镜像<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/16/w2buqg.jpg"></p><blockquote><p>详解：<br><strong>NAME</strong>：镜像仓库源的名称<br><strong>DESCRIPTION</strong>：镜像的描述<br><strong>STARS</strong>：点赞、喜欢数(类似Github的star)<br><strong>AUTOMATED</strong>：是否支持自动构建</p></blockquote><p>2、下载镜像<br><code>docker pull choerodon/cibase</code><br>参数说明：<br>-a：拉取所有目标镜像(即拉去含有名字的所有镜像)<br>–disable-content-trust：忽略镜像的校验,默认开启<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/16/w2bmM8.jpg"></p><p>3、查看所有镜像<br><code>docker images</code><br>参数说明：<br>-a：列出本地所有镜像(包括中间映像层,默认是过滤掉的)<br>–digests：显示镜像摘要信息<br>–no-trunc：显示完整镜像信息<br>-q：只显示镜像ID<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/16/w2bVRP.jpg"></p><blockquote><p>详解：<br><strong>REPOSITORY</strong>：镜像名称<br><strong>TAG</strong>：镜像的标签<br><strong>IMAGE ID</strong>：镜像ID<br><strong>CREATED</strong>：镜像创建时间<br><strong>SIZE</strong>：镜像大小</p></blockquote><p>4、创建并运行一个容器<br><code>docker run -tid choerodon/cibase:latest</code><br>参数说明：<br>-d：后台运行并返回容器ID<br>-i：交互模式运行容器,通常与-t连用<br>-t：为容器重新分配一个伪输入终端,通常与-i连用<br>–name=”youName”：指定容器名称<br>-p：指定端口映射,格式：主机端口：容器端口<br>-v：建立本地路径到容器路径的映射，格式：/本地路径：/容器内路径<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/16/w2bEGt.jpg"></p><p>5、查看正在运行的容器<br><code>docker ps -a</code><br>参数说明：<br>-a：显示所用容器，包括未运行的<br>-l：显示最近创建的容器<br>-n：列出最近创建的n个容器<br>-s：显示总的文件大小<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/16/w2bZxf.jpg"></p><blockquote><p>详解：<br><strong>CONTAINER ID</strong>：容器ID<br><strong>IMAGE</strong>：使用的镜像<br><strong>COMMAND</strong>：启动容器时运行的命令<br><strong>CREATED</strong>：容器创建时间<br><strong>PORTS</strong>: 容器的端口信息和使用的连接类型(tcp/udp)<br><strong>NAMES</strong>: 自动分配的容器名称<br><strong>STATUS</strong>：容器状态<br>有7种状态：<br>created（已创建）<br>restarting（重启中）<br>running（运行中）<br>removing（迁移中）<br>paused（暂停）<br>exited（停止）<br>dead（死亡）</p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Docker常用操作&quot;&gt;&lt;a href=&quot;#Docker常用操作&quot; class=&quot;headerlink&quot; title=&quot;Docker常用操作&quot;&gt;&lt;/a&gt;Docker常用操作&lt;/h1&gt;&lt;p&gt;1、查询docker镜像&lt;br&gt;&lt;code&gt;docker search ch</summary>
      
    
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/categories/Docker/"/>
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Docker(一)安装</title>
    <link href="http://www.ifunan.cn/posts/4533a720/"/>
    <id>http://www.ifunan.cn/posts/4533a720/</id>
    <published>2020-09-10T03:05:32.000Z</published>
    <updated>2020-10-15T08:16:57.886Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Docker安装"><a href="#Docker安装" class="headerlink" title="Docker安装"></a>Docker安装</h1><h2 id="安装Docker"><a href="#安装Docker" class="headerlink" title="安装Docker"></a>安装Docker</h2><ol><li>删除已安装的Docker<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">sudo yum remove docker \</span><br><span class="line">docker-client \</span><br><span class="line">docker-client-latest \</span><br><span class="line">docker-common \</span><br><span class="line">docker-latest \</span><br><span class="line">docker-latest-logrotate \</span><br><span class="line">docker-logrotate \</span><br><span class="line">docker-selinux \</span><br><span class="line">docker-engine-selinux \</span><br><span class="line">docker-engine</span><br></pre></td></tr></table></figure></li><li>配置阿里云Docker Yum源<br><code>yum install -y yum-utils device-mapper-persistent-data lvm2</code><br><code>yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</code></li><li>查看Docker版本<br><code>yum list docker-ce --showduplicates</code></li><li>安装较旧版本（需要指定完整的 rpm 包的包名，并且加上–setopt=obsoletes=0 参数）<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">yum install -y --setopt&#x3D;obsoletes&#x3D;0 \</span><br><span class="line">docker-ce-17.03.2.ce-1.el7.centos.x86_64 \</span><br><span class="line">docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch</span><br></pre></td></tr></table></figure></li><li>安装Docker最新版本(最新版本不需要指定版本号)<br><code>yum install docker-ce</code></li><li>启动Docker服务<br><code>systemctl enable docker</code><br><code>systemctl start docker</code></li></ol><h2 id="Docker添加阿里云镜像加速器"><a href="#Docker添加阿里云镜像加速器" class="headerlink" title="Docker添加阿里云镜像加速器"></a>Docker添加阿里云镜像加速器</h2><h3 id="配置阿里云加速器"><a href="#配置阿里云加速器" class="headerlink" title="配置阿里云加速器"></a>配置阿里云加速器</h3><ol><li>登录<a href="https://www.aliyun.com/">阿里云</a>右上角登录或注册<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/10/wGQL90.jpg"></li><li>在搜索栏输入<strong>容器镜像服务</strong><br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/10/wGQO3V.jpg"></li><li>找到<strong>容器镜像服务</strong>，点击<strong>立即开通</strong><br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/10/wGQXcT.jpg"></li><li>点击进入后，找到下方的<strong>镜像加速器</strong>并点击<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/10/wGQbhq.jpg"></li><li>点击后即可看见加速器地址，复制后继续后边的步骤即可<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/09/10/wG3s74.jpg"></li></ol><h3 id="将加速器配置到docker的daemon-json文件中"><a href="#将加速器配置到docker的daemon-json文件中" class="headerlink" title="将加速器配置到docker的daemon.json文件中"></a>将加速器配置到docker的daemon.json文件中</h3><ol><li>编辑daemon.json(新建)<br><code>vim /etc/docker/daemon.json</code></li><li>设置加速器地址<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#123; </span><br><span class="line"> &quot;registry-mirrors&quot;: [&quot;你的加速器地址&quot;]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>最后重新加载重启Docker<br><code>systemctl daemon-reload</code><br><code>systemctl restart docker</code></li><li>测试Docker是否安装成功<br><code>docker -h</code></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Docker安装&quot;&gt;&lt;a href=&quot;#Docker安装&quot; class=&quot;headerlink&quot; title=&quot;Docker安装&quot;&gt;&lt;/a&gt;Docker安装&lt;/h1&gt;&lt;h2 id=&quot;安装Docker&quot;&gt;&lt;a href=&quot;#安装Docker&quot; class=&quot;head</summary>
      
    
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/categories/Docker/"/>
    
    
    <category term="Docker" scheme="http://www.ifunan.cn/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Shell通配符</title>
    <link href="http://www.ifunan.cn/posts/b707d6e0/"/>
    <id>http://www.ifunan.cn/posts/b707d6e0/</id>
    <published>2020-05-21T04:27:12.000Z</published>
    <updated>2020-10-15T08:16:57.905Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Shell通配符"><a href="#Shell通配符" class="headerlink" title="Shell通配符"></a>Shell通配符</h1><h2 id="Shell常用通配符"><a href="#Shell常用通配符" class="headerlink" title="Shell常用通配符"></a>Shell常用通配符</h2><table><thead><tr><th align="center">字符</th><th align="center">含义</th><th align="left">实例</th></tr></thead><tbody><tr><td align="center">*</td><td align="center">匹配0或多个字符</td><td align="left">a*b,表示a与b之间可以有任意长度的任意字符，也可以一个都没有,如aabcb、axyzb、a012b、ab</td></tr><tr><td align="center">?</td><td align="center">匹配任意一个字符</td><td align="left">a?b,表示a与b之间必须也只能有一个字符,可以是任意字符,如aab、abb、acb、a0b</td></tr><tr><td align="center">[list]</td><td align="center">匹配list中的任意单一字符</td><td align="left">a[xyz]b,表示a与b之间必须也只能有一个字符,但只能是x或y或z,如:axb、ayb、azb</td></tr><tr><td align="center">[!list]</td><td align="center">匹配除list中的任意单一字符</td><td align="left">a[!0-9],表示a与b之间必须也只能有一个字符,但不能是阿拉伯数字,如axb、aab、a-b</td></tr><tr><td align="center">[c1-c2]</td><td align="center">匹配c1-c2中的任意单一字符,如：[0-9][a-z]</td><td align="left">a[0-9]b,表示0与9之间必须也只能有一个字符如a0b、a1b、a9b</td></tr><tr><td align="center">{string1,string2}</td><td align="center">匹配string1或string2（或更多）其一字符串</td><td align="left">a{abc,xyz,123}b,表示a与b之间只能是abc或xzy或123</td></tr></tbody></table><h2 id="Shell元字符"><a href="#Shell元字符" class="headerlink" title="Shell元字符"></a>Shell元字符</h2><table><thead><tr><th align="center">字符</th><th align="left">说明</th></tr></thead><tbody><tr><td align="center">^</td><td align="left">只匹配行首</td></tr><tr><td align="center">$</td><td align="left">只匹配行尾</td></tr><tr><td align="center">*</td><td align="left">只一个单字符后紧跟*，匹配0个或多个此单字符</td></tr><tr><td align="center">+</td><td align="left">匹配一个或多个字符</td></tr><tr><td align="center">?</td><td align="left">匹配模式出现频率，例如使用/XY?Z/匹配X Y Z或Y Z</td></tr><tr><td align="center">[]</td><td align="left">只匹配[]内字符。可以是单个字符，也可以是字符序列。可以使用-表示[]内字符序列范围，如用[1-5]代替[1 2 3 4 5]</td></tr><tr><td align="center">[x-y]</td><td align="left">匹配以字符范围组成的组中的一个字符</td></tr><tr><td align="center">[^]</td><td align="left">匹配一个不在范围内的字符</td></tr><tr><td align="center">.</td><td align="left">只匹配任意单字符</td></tr><tr><td align="center">pattern{n}</td><td align="left">只用来匹配前面pattern出现次数,n为次数</td></tr><tr><td align="center">pattern{n,}m</td><td align="left">含义同上,但次数最少为n*</td></tr><tr><td align="center">pattern{n,m}</td><td align="left">含义同上,但pattern出现次数在n与m之间</td></tr></tbody></table><h2 id="Shell转义字符"><a href="#Shell转义字符" class="headerlink" title="Shell转义字符"></a>Shell转义字符</h2><table><thead><tr><th align="center">字符</th><th align="left">说明</th></tr></thead><tbody><tr><td align="center">‘’（单引号）</td><td align="left">又叫硬转义,其内部所有的Shell元字符、通配符都会被关掉。注：硬转义中不允许出现’（单引号）</td></tr><tr><td align="center">(反斜杠)</td><td align="left">又叫转义，去除其后紧跟的元字符或通配符的特殊意义</td></tr></tbody></table><h2 id="Shell逻辑运算符及表达式"><a href="#Shell逻辑运算符及表达式" class="headerlink" title="Shell逻辑运算符及表达式"></a>Shell逻辑运算符及表达式</h2><h3 id="条件运算符"><a href="#条件运算符" class="headerlink" title="条件运算符"></a>条件运算符</h3><table><thead><tr><th align="center">运算符号</th><th align="center">代表意义</th><th align="center">应用</th><th align="left">说明</th></tr></thead><tbody><tr><td align="center">=</td><td align="center">等于</td><td align="center">整型或字符串比较:str1=str2</td><td align="left">字符串str1和字符串str2相等时返回真,如果在[]中,只能是字符串</td></tr><tr><td align="center">==</td><td align="center">等于</td><td align="center">整型或字符串比较:str1==str2</td><td align="left">字符串str1和字符串str2相等时返回真,如果在[]中,只能是字符串</td></tr><tr><td align="center">!=</td><td align="center">不等于</td><td align="center">整型或字符串比较:str1!=str2</td><td align="left">字符串str1和字符串str2不相等时返回真,如果在[]中,只能是字符串</td></tr><tr><td align="center">&lt;</td><td align="center">小于</td><td align="center">整型或字符串比较:str1&lt;str2</td><td align="left">按字典顺序排序,字符串str1在字符串str2之前,在[]中,它表示字符串,如需使用请转义&lt;</td></tr><tr><td align="center">&gt;</td><td align="center">大于</td><td align="center">整型或字符串比较:str1&gt;str2</td><td align="left">在[]中,它表示字符串,如需使用请转义&gt;</td></tr><tr><td align="center">-eq</td><td align="center">等于</td><td align="center">整型比较:int1 -eq int2</td><td align="left">如果int1等于int2,则返回真</td></tr><tr><td align="center">-ne</td><td align="center">不等于</td><td align="center">整型比较:int1 -ne int2</td><td align="left">如果int1不等于int2,则返回真</td></tr><tr><td align="center">-lt</td><td align="center">小于</td><td align="center">整型比较:int1 -lt int2</td><td align="left">如果int1小于int2,则返回真</td></tr><tr><td align="center">-gt</td><td align="center">大于</td><td align="center">整型比较:int1 -gt int2</td><td align="left">如果int1大于int2,则返回真</td></tr><tr><td align="center">-le</td><td align="center">小于或等于</td><td align="center">整型比较:int -le int2</td><td align="left">如果int1小于或等于int2,则返回真</td></tr><tr><td align="center">-ge</td><td align="center">大于或等于</td><td align="center">整型比较:int1 -ge int2</td><td align="left">如果int1大于或等于int2,则返回真</td></tr><tr><td align="center">-z</td><td align="center">空字符串</td><td align="center">字符串比较:-z string</td><td align="left">字符串string为空串(长度为0）时返回真</td></tr><tr><td align="center">-n</td><td align="center">非空字符串</td><td align="center">字符串比较:-n string</td><td align="left">字符串string为非空字符串时返回真</td></tr></tbody></table><h3 id="逻辑运算符"><a href="#逻辑运算符" class="headerlink" title="逻辑运算符"></a>逻辑运算符</h3><table><thead><tr><th align="center">运算符号</th><th align="center">代表意义</th><th align="center">应用</th><th align="left">说明</th></tr></thead><tbody><tr><td align="center">-a</td><td align="center">双方都成立(and)</td><td align="center">逻辑表达式 -a 逻辑表达式</td><td align="left">在[]表达式中使用</td></tr><tr><td align="center">-o</td><td align="center">单方成立(or)</td><td align="center">逻辑表达式 -o 逻辑表达式</td><td align="left">在[]表达式中使用</td></tr><tr><td align="center">!</td><td align="center">逻辑否,条件为假,结果为真</td><td align="center">&nbsp;</td><td align="left">&nbsp;</td></tr><tr><td align="center">&amp;&amp;</td><td align="center">双方都成立（and）</td><td align="center">逻辑表达式 &amp;&amp; 逻辑表达式</td><td align="left">在[[]]表达式中使用</td></tr><tr><td align="center">\</td><td align="center">\</td><td align="center">&nbsp;</td><td align="left">单方成立(or)</td></tr></tbody></table><h3 id="文件和目录判断符"><a href="#文件和目录判断符" class="headerlink" title="文件和目录判断符"></a>文件和目录判断符</h3><table><thead><tr><th align="center">逻辑符号</th><th align="center">代表意义</th><th align="center">应用</th><th align="left">说明</th></tr></thead><tbody><tr><td align="center">-f</td><td align="center">判断文件是否存在</td><td align="center">-f filename</td><td align="left">当filename存在并且是正规文件时返回真</td></tr><tr><td align="center">-d</td><td align="center">判断目录是否存在</td><td align="center">-d pathname</td><td align="left">当pathname存在并且是一个目录时返回真</td></tr><tr><td align="center">-b</td><td align="center">判断是否为一个块文件</td><td align="center">-b filename</td><td align="left">当filename存在并且是块文件时返回真(返回0)</td></tr><tr><td align="center">-c</td><td align="center">判断是否为一个字符文件</td><td align="center">-c filename</td><td align="left">当filename存在并且是字符文件时返回真</td></tr><tr><td align="center">-S</td><td align="center">判断是否为一个socket</td><td align="center">-S filename</td><td align="left">当filename存在并且是socket时返回真</td></tr><tr><td align="center">-L</td><td align="center">判断是否为一个符号链接文件</td><td align="center">-L filename</td><td align="left">当filename存在并且是符号链接文件时返回真</td></tr><tr><td align="center">-e</td><td align="center">判断文件或目录是否存在</td><td align="center">-e pathname</td><td align="left">当由pathname指定的文件或目录存在时返回真</td></tr></tbody></table><h3 id="程序的逻辑卷标判断符"><a href="#程序的逻辑卷标判断符" class="headerlink" title="程序的逻辑卷标判断符"></a>程序的逻辑卷标判断符</h3><table><thead><tr><th align="center">逻辑符号</th><th align="center">代表意义</th><th align="center">应用</th><th align="left">说明</th></tr></thead><tbody><tr><td align="center">-G</td><td align="center">判断是否由GID所执行的程序所拥有</td><td align="center">-G pathname</td><td align="left">当由pathname指定的文件或目录存在,并且属于当前进程有效用户ID的用户的用户组时返回真</td></tr><tr><td align="center">-O</td><td align="center">判断是否由UID所执行的程序所拥有</td><td align="center">-O pathname</td><td align="left">当由pathname指定的文件或目录存在,并且被当前进程有效用户ID的用户拥有时返回真</td></tr><tr><td align="center">-p</td><td align="center">判断是否为程序间传送信息的命名管道或FIFO</td><td align="center">-p filename</td><td align="left">当filename存在并且是命名管道时返回真</td></tr></tbody></table><h3 id="档案的属性判断符"><a href="#档案的属性判断符" class="headerlink" title="档案的属性判断符"></a>档案的属性判断符</h3><table><thead><tr><th align="center">逻辑符号</th><th align="center">代表意义</th><th align="center">应用</th><th align="left">说明</th></tr></thead><tbody><tr><td align="center">-r</td><td align="center">判断是否为可读的属性</td><td align="center">-r pathname</td><td align="left">当由pathname指定的文件或目录存在并且可读时返回真</td></tr><tr><td align="center">-w</td><td align="center">判断是否为可以写入的属性</td><td align="center">-w pathname</td><td align="left">当由pathname指定的文件或目录存在并且可写时返回真</td></tr><tr><td align="center">-x</td><td align="center">判断是否为可执行的属性</td><td align="center">-x pathname</td><td align="left">当由pathname指定的文件或目录存在并且可执行时返回真</td></tr><tr><td align="center">-s</td><td align="center">判断是否为非空白档案</td><td align="center">-s filename</td><td align="left">当filename存在并且文件大小大于0时返回真</td></tr><tr><td align="center">-u</td><td align="center">判断是否具有SUID的属性</td><td align="center">-u pathname</td><td align="left">当由pathname指定的文件或目录存在并且设置了SUID位时返回真</td></tr><tr><td align="center">-g</td><td align="center">判断是否具有SGID的属性</td><td align="center">-g pathname</td><td align="left">当由pathname指定的文件或目录存在并且设置了SGID位时返回真</td></tr><tr><td align="center">-k</td><td align="center">判断是否具有粘滞的属性</td><td align="center">-k pathname</td><td align="left">当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真</td></tr></tbody></table><h3 id="两个档案之间的判断与比较符"><a href="#两个档案之间的判断与比较符" class="headerlink" title="两个档案之间的判断与比较符"></a>两个档案之间的判断与比较符</h3><table><thead><tr><th align="center">逻辑符号</th><th align="center">代表意义</th><th align="center">应用</th><th align="left">说明</th></tr></thead><tbody><tr><td align="center">-nt</td><td align="center">第一个比第二个档案新</td><td align="center">file1 -nt file2</td><td align="left">file1比file2新时返回真</td></tr><tr><td align="center">-ot</td><td align="center">第一个比第二个档案旧</td><td align="center">file1 -ot file2</td><td align="left">file1比file2旧时返回真</td></tr><tr><td align="center">-ef</td><td align="center">第一个与第二个档案为同一个档案</td><td align="center">file1 -ef file2</td><td align="left">file1和file2是同一个档案时返回真</td></tr></tbody></table>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Shell通配符&quot;&gt;&lt;a href=&quot;#Shell通配符&quot; class=&quot;headerlink&quot; title=&quot;Shell通配符&quot;&gt;&lt;/a&gt;Shell通配符&lt;/h1&gt;&lt;h2 id=&quot;Shell常用通配符&quot;&gt;&lt;a href=&quot;#Shell常用通配符&quot; class=&quot;</summary>
      
    
    
    
    <category term="云系统维护" scheme="http://www.ifunan.cn/categories/%E4%BA%91%E7%B3%BB%E7%BB%9F%E7%BB%B4%E6%8A%A4/"/>
    
    
    <category term="Shell" scheme="http://www.ifunan.cn/tags/Shell/"/>
    
  </entry>
  
  <entry>
    <title>Ceph分布式存储系统搭建</title>
    <link href="http://www.ifunan.cn/posts/a0556a43/"/>
    <id>http://www.ifunan.cn/posts/a0556a43/</id>
    <published>2020-04-26T04:35:55.000Z</published>
    <updated>2020-10-15T08:16:57.893Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Ceph分布式存储系统搭建"><a href="#Ceph分布式存储系统搭建" class="headerlink" title="Ceph分布式存储系统搭建"></a>Ceph分布式存储系统搭建</h1><p>实验环境：</p><table><thead><tr><th align="center">主机名</th><th align="center">CPU核心</th><th align="center">系统磁盘</th><th align="center">IP地址（NAT）</th><th align="center">系统</th></tr></thead><tbody><tr><td align="center">ceph01</td><td align="center">1*2</td><td align="center">40GB</td><td align="center">192.168.200.20</td><td align="center">CentOS 7</td></tr><tr><td align="center">ceph02</td><td align="center">1*2</td><td align="center">40GB</td><td align="center">192.168.200.30</td><td align="center">CentOS 7</td></tr><tr><td align="center">ceph03</td><td align="center">1*2</td><td align="center">40GB</td><td align="center">192.168.200.40</td><td align="center">CentOS 7</td></tr></tbody></table><blockquote><p>注：以下操作须在不同server上进行，请看清后再行操作</p></blockquote><h2 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h2><h3 id="ceph01-amp-ceph02-amp-ceph03"><a href="#ceph01-amp-ceph02-amp-ceph03" class="headerlink" title="ceph01 &amp; ceph02 &amp; ceph03"></a>ceph01 &amp; ceph02 &amp; ceph03</h3><ol><li>配置IP到主机名映射<br><code>[root@ceph01]# echo &quot;192.168.200.20 ceph01&quot; &gt;&gt; /etc/hosts</code><br><code>[root@ceph01]# echo &quot;192.168.200.30 ceph02&quot; &gt;&gt; /etc/hosts</code><br><code>[root@ceph01]# echo &quot;192.168.200.40 ceph03&quot; &gt;&gt; /etc/hosts</code></li><li>关闭SELinux<br><code>[root@ceph01]# sed -i &#39;s/SELINUX=.*/SELINUX=disabled/g&#39; /etc/selinux/config</code><br><code>[root@ceph01]# setenforce 0</code><br><code>[root@ceph01]# getenforce</code></li><li>关闭防火墙<br><code>[root@ceph01]# iptables -F</code><br><code>[root@ceph01]# iptables -X</code><br><code>[root@ceph01]# iptables -Z</code><br><code>[root@ceph01]# systemctl stop firewalld</code><br><code>[root@ceph01]# systemctl disable firewalld.service</code><blockquote><p>请在ceph02和ceph03上重复以上操作</p></blockquote></li></ol><h3 id="ceph01"><a href="#ceph01" class="headerlink" title="ceph01"></a>ceph01</h3><p>1.设置SSH无密码登录ceph02和ceph03<br><code>[root@ceph01]# ssh-keygen</code><br><code>[root@ceph01]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@ceph02</code><br><code>[root@ceph01]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@ceph03</code><br>2. 安装时钟同步<br><code>[root@ceph01]# yum install ntp ntpdate -y</code><br>3. 配置ntp,注释掉其他ntp服务器,设置为本机提供时钟同步<br><code>[root@ceph01]# vi /etc/ntp.conf</code><br>添加以下两行：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">server 127.127.1.0</span><br><span class="line">fudge 127.127.1.0 stratum 10</span><br></pre></td></tr></table></figure><p><code>[root@ceph01]# systemctl start ntpd.service</code><br><code>[root@ceph01]# systemctl enable ntpd.service</code></p><h3 id="ceph02-amp-ceph03"><a href="#ceph02-amp-ceph03" class="headerlink" title="ceph02 &amp; ceph03"></a>ceph02 &amp; ceph03</h3><ol><li>同步为ceph01的时间<br><code>[root@ceph02]# yum install ntp ntpdate -y</code><br><code>[root@ceph02]# ntpdate 192.168.200.20</code><br><code>[root@ceph02]# systemctl enable ntpd.service</code><br><code>[root@ceph02]# systemctl status ntpd.service</code><blockquote><p>ceph03重复以上操作</p></blockquote></li></ol><h3 id="ceph01-1"><a href="#ceph01-1" class="headerlink" title="ceph01"></a>ceph01</h3><ol><li>安装FTP<br><code>[root@ceph01]# yum install vsftpd -y</code></li><li>设置FTP匿名访问的路径<br><code>[root@ceph01]# echo &quot;anon_root=/files/&quot; &gt;&gt; /etc/vsftpd/vsftpd.conf</code><br><code>[root@ceph01]# systemctl restart vsftpd</code><br><code>[root@ceph01]# systemctl enable vsftpd</code></li><li>配置yum源（设置光驱连接到虚拟机中）<br><code>[root@ceph01]# mkdir -p /files/centos</code><br><code>[root@ceph01]# mount /dev/cdrom /mnt</code><br><code>[root@ceph01]# cp -rfv /mnt/* /files/centos</code><br><code>[root@ceph01]# umount /mnt</code><br>更换XianDian-IaaS-v2.0-20170420.iso到光驱中<br><code>[root@ceph01]# mount /dev/cdrom /mnt</code><br><code>[root@ceph01]# cp -rfv /mnt/* /files</code><br><code>[root@ceph01]# umount /mnt</code></li><li>安装python包<br><code>[root@ceph01]# rpm -ivh /files/iaas-repo/base/python-backports-1.0-8.el7.x86_64.rpm</code><br><code>[root@ceph01]# rpm -ivh /files/iaas-repo/base/python-backports-ssl_match_hostname-3.4.0.2-4.el7.noarch.rpm</code><br><code>[root@ceph01]# rpm -ivh /files/iaas-repo/base/python-setuptools-0.9.8-4.el7.noarch.rpm</code></li></ol><h3 id="ceph01-amp-ceph02-amp-ceph03-1"><a href="#ceph01-amp-ceph02-amp-ceph03-1" class="headerlink" title="ceph01 &amp; ceph02 &amp; ceph03"></a>ceph01 &amp; ceph02 &amp; ceph03</h3><p><code>[root@ceph01]# cd /etc/yum.repos.d</code><br><code>[root@ceph01]# mkdir backup</code><br><code>[root@ceph01]# mv C* backup/</code><br><code>[root@ceph01]# vi local.repo</code><br>添加如下内容：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">[centos]</span><br><span class="line">name&#x3D;centos</span><br><span class="line">baseurl&#x3D;ftp:&#x2F;&#x2F;192.168.200.20&#x2F;centos</span><br><span class="line">gpgcheck&#x3D;0</span><br><span class="line">enable&#x3D;1</span><br><span class="line">[iaas]</span><br><span class="line">name&#x3D;iaas</span><br><span class="line">baseurl&#x3D;ftp:&#x2F;&#x2F;192.168.200.20&#x2F;iaas-repo</span><br><span class="line">gpgcheck&#x3D;0</span><br><span class="line">enable&#x3D;1</span><br></pre></td></tr></table></figure><p><code>[root@ceph01]# yum clean all</code><br><code>[root@ceph01]# yum repolist</code></p><h2 id="安装配置Ceph"><a href="#安装配置Ceph" class="headerlink" title="安装配置Ceph"></a>安装配置Ceph</h2><h3 id="ceph01-2"><a href="#ceph01-2" class="headerlink" title="ceph01"></a>ceph01</h3><ol><li>安装Ceph<br><code>[root@ceph01]# yum install ceph-deploy -y</code><br><code>[root@ceph01]# mkdir /etc/ceph</code><br><code>[root@ceph01]# cd /etc/ceph</code></li><li>创建新的集群<br><code>[root@ceph01]# ceph-deploy new ceph01</code></li><li>所有节点安装Ceph<br><code>[root@ceph01]# ceph-deploy install ceph01 ceph02 ceph03</code></li><li>检查Ceph版本<br><code>[root@ceph01]# ceph -v</code></li><li>创建第一个Ceph monitor<br><code>[root@ceph01]# ceph-deploy --overwrite-conf mon create-initial</code></li><li>查看集群状态<br><code>[root@ceph01]# ceph -s</code></li><li>检查ceph01上可用磁盘<br><code>[root@ceph01]# ceph-deploy disk list ceph01</code></li><li>创建OSD所用目录并设置权限<br><code>[root@ceph01]# mkdir -p /opt/osd1</code><br><code>[root@ceph01]# chmod 777 /opt/osd1</code></li></ol><h3 id="ceph02"><a href="#ceph02" class="headerlink" title="ceph02"></a>ceph02</h3><p><code>[root@ceph01]# mkdir -p /opt/osd2</code><br><code>[root@ceph01]# chmod 777 /opt/osd2</code></p><h3 id="ceph03"><a href="#ceph03" class="headerlink" title="ceph03"></a>ceph03</h3><p><code>[root@ceph01]# mkdir -p /opt/osd3</code><br><code>[root@ceph01]# chmod 777 /opt/osd3</code></p><h3 id="ceph01-3"><a href="#ceph01-3" class="headerlink" title="ceph01"></a>ceph01</h3><ol><li><p>创建OSD节点<br><code>[root@ceph01]# ceph-deploy osd prepare ceph01:/opt/osd1 ceph02:/opt/osd2 ceph03:/opt/osd3</code></p></li><li><p>激活OSD节点<br><code>[root@ceph01]# ceph-deploy osd activate  ceph01:/opt/osd1 ceph02:/opt/osd2 ceph03:/opt/osd3</code></p></li><li><p>检查集群状态<br><code>[root@ceph01]# ceph -s</code></p><blockquote><p>health(健康)显示：OK则为成功<br>cluster 147354a2-e174-4ea6-8464-58f1839fbd2f<br>health HEALTH_OK<br>monmap e1: 1 mons at {ceph-node1=192.168.200.211:6789/0}<br>election epoch 2, quorum 0 ceph-node1<br>osdmap e13: 3 osds: 3 up, 3 in<br>pgmap v19: 64 pgs, 1 pools, 0 bytes data, 0 objects<br>25907 MB used, 55365 MB / 81272 MB avail<br>64 active+clean</p></blockquote></li><li><p>开放权限给其他节点，进行灾备处理<br><code>[root@ceph01]# ceph-deploy admin ceph-node&#123;1,2,3&#125;</code><br><code>[root@ceph01]# chmod +r /etc/ceph/ceph.client.admin.keyring</code></p></li></ol><h2 id="Ceph运维操作"><a href="#Ceph运维操作" class="headerlink" title="Ceph运维操作"></a>Ceph运维操作</h2><h3 id="ceph01-amp-ceph02-amp-ceph03-2"><a href="#ceph01-amp-ceph02-amp-ceph03-2" class="headerlink" title="ceph01 &amp; ceph02 &amp; ceph03"></a>ceph01 &amp; ceph02 &amp; ceph03</h3><ol><li>检查ceph的安装状态<br><code>[root@ceph01]# ceph status</code></li><li>观察集群的健康状况<br><code>[root@ceph01]# ceph -w</code></li><li>检查ceph monitor仲裁状态<br><code>[root@ceph01]# ceph quorum_status --format json-pretty</code></li><li>导出monitor信息<br><code>[root@ceph01]# ceph mon dump</code></li><li>检查集群使用状态<br><code>[root@ceph01]# ceph df</code></li><li>检查ceph monitor、osd、PG状态<br><code>[root@ceph01]# ceph mon stat</code><br><code>[root@ceph01]# ceph osd stat</code><br><code>[root@ceph01]# ceph pg stat</code></li><li>列表pg，导出pg<br><code>[root@ceph01]# ceph pg dump</code></li><li>ceph 存储池列表<br><code>[root@ceph01]# ceph osd lspools</code></li><li>检查osd的crush<br><code>[root@ceph01]# ceph osd tree</code></li><li>列表集群的认证密钥<br><code>[root@ceph01]# ceph auth list</code></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Ceph分布式存储系统搭建&quot;&gt;&lt;a href=&quot;#Ceph分布式存储系统搭建&quot; class=&quot;headerlink&quot; title=&quot;Ceph分布式存储系统搭建&quot;&gt;&lt;/a&gt;Ceph分布式存储系统搭建&lt;/h1&gt;&lt;p&gt;实验环境：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
</summary>
      
    
    
    
    <category term="云存储技术" scheme="http://www.ifunan.cn/categories/%E4%BA%91%E5%AD%98%E5%82%A8%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="Ceph" scheme="http://www.ifunan.cn/tags/Ceph/"/>
    
  </entry>
  
  <entry>
    <title>Ansible安装配置</title>
    <link href="http://www.ifunan.cn/posts/bfa5a896/"/>
    <id>http://www.ifunan.cn/posts/bfa5a896/</id>
    <published>2020-04-21T16:35:56.000Z</published>
    <updated>2020-10-15T08:16:57.897Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Ansible安装配置"><a href="#Ansible安装配置" class="headerlink" title="Ansible安装配置"></a>Ansible安装配置</h1><p>概要：Ansible是一款基于Python开发的自动化运维开源工具，主要实现批量系统配置、批量程序部署、批量运行命令、批量执行任务等。<br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/04/22/JYEsPI.png"><br>实验环境：</p><table><thead><tr><th align="center">主机类别</th><th align="center">主机名</th><th align="center">IP地址</th><th align="center">操作系统</th></tr></thead><tbody><tr><td align="center">Ansible 控制主机</td><td align="center">ansible-ctl</td><td align="center">192.168.200.20</td><td align="center">CentOS 7</td></tr><tr><td align="center">Ansible 被控节点</td><td align="center">web01</td><td align="center">192.168.200.30</td><td align="center">CentOS 7</td></tr><tr><td align="center">Ansible 被控节点</td><td align="center">web02</td><td align="center">192.168.200.40</td><td align="center">Cent0S 7</td></tr></tbody></table><h2 id="安装Ansible"><a href="#安装Ansible" class="headerlink" title="安装Ansible"></a>安装Ansible</h2><p>此处使用阿里云的源（需要联网操作）<br><code>[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo</code><br>安装Ansible<br><code>[root@localhost ~]# yum install ansible -y</code></p><h2 id="配置Ansible环境"><a href="#配置Ansible环境" class="headerlink" title="配置Ansible环境"></a>配置Ansible环境</h2><p>Ansible的配置文件以ini格式存储。在运行Ansible命令时，命令将采用预先设定的顺序查找配置文件，默认步骤如下：</p><ul><li>首先检查系统环境变量；</li><li>其次，检查当前目录下的ansible.cfg配置文件；</li><li>再次，检查当前用户home目录下的.ansible.cfg文件；</li><li>最后，检查ansible默认yum安装时自动产生的文件/etc/ansible/ansible.cfg。</li></ul><h3 id="修改配置文件-etc-ansible-ansible-cfg"><a href="#修改配置文件-etc-ansible-ansible-cfg" class="headerlink" title="修改配置文件/etc/ansible/ansible.cfg"></a>修改配置文件/etc/ansible/ansible.cfg</h3><p><code>[root@localhost ~]# vi /etc/ansible/ansible.cfg</code><br>修改如下参数并取消注释:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">inventory      &#x3D; &#x2F;etc&#x2F;ansible&#x2F;hosts</span><br><span class="line">library        &#x3D; &#x2F;usr&#x2F;share&#x2F;my_modules&#x2F;</span><br><span class="line">forks          &#x3D; 5</span><br><span class="line">sudo_user      &#x3D; root</span><br><span class="line">remote_port    &#x3D; 22</span><br><span class="line">host_key_checking &#x3D; False</span><br><span class="line">timeout &#x3D; 60</span><br><span class="line">log_path &#x3D; &#x2F;var&#x2F;log&#x2F;ansible.log</span><br></pre></td></tr></table></figure><h3 id="配置控制主机SSH无密码访问被控节点"><a href="#配置控制主机SSH无密码访问被控节点" class="headerlink" title="配置控制主机SSH无密码访问被控节点"></a>配置控制主机SSH无密码访问被控节点</h3><ol><li>Ansible控制主机创建密钥(默认在 /root/.ssh/id_rsa.pub)，id_rsa为私钥，id_rsa.pub为公钥<br><code>[root@localhost ~]# ssh-keygen</code></li><li>将此公钥下发到两个被控节点(弹出提出输入 yes即可）<br><code>[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.200.30</code><br><code>[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.200.40</code></li><li>验证无密码SSH是否成功<br><code>[root@localhost ~]# ssh root@192.168.200.30</code><br><code>[root@localhost ~]# exit</code><br><code>[root@localhost ~]# ssh root@192.168.200.40</code><br><code>[root@localhost ~]# exit</code></li></ol><h2 id="测试Ansible"><a href="#测试Ansible" class="headerlink" title="测试Ansible"></a>测试Ansible</h2><h3 id="主机连通"><a href="#主机连通" class="headerlink" title="主机连通"></a>主机连通</h3><ol><li>配置ansible被控节点的主机与组(注意去掉注释）<br><code>[root@localhost ~]# vi /etc/ansible/hosts</code><br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/04/22/JYVnJI.png"></li><li>使用Ansible的ping模块对单台主机分别进行ping操作，出现如图所示表示连通<br><code>[root@localhost ~]# ansible 192.168.100.129 -m ping</code><br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/04/22/JYVZod.png"><blockquote><p>注：如上命令如由输出WARNING信息，可按提示更改主配置文件ansible.cfg，取消警告信息</p></blockquote></li><li>ping webservers组<br><code>[root@localhost ~]# ansible webservers -m ping</code><br><img src= "/img/loading.gif" data-lazy-src="https://s1.ax1x.com/2020/04/22/JYVVdH.png"></li></ol><h3 id="在控制主机发送命令到被控节点"><a href="#在控制主机发送命令到被控节点" class="headerlink" title="在控制主机发送命令到被控节点"></a>在控制主机发送命令到被控节点</h3><ol><li>批量执行命令<br><code>[root@localhost ~]# ansible webservers -m command -a &quot;pwd&quot;</code></li><li>在用户home目录下创建一个资源清单文件invertory.cfg并写入内容<br><code>[root@localhost ~]# ansible webservers -m command -a &quot;touch /root/inventory.cfg&quot;</code><br><code>[root@localhost ~]# ansible webservers -m command -a &quot;echo Hello Ansible! &gt; /root/inventory.cfg&quot;</code></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Ansible安装配置&quot;&gt;&lt;a href=&quot;#Ansible安装配置&quot; class=&quot;headerlink&quot; title=&quot;Ansible安装配置&quot;&gt;&lt;/a&gt;Ansible安装配置&lt;/h1&gt;&lt;p&gt;概要：Ansible是一款基于Python开发的自动化运维开源工具，</summary>
      
    
    
    
    <category term="云系统维护" scheme="http://www.ifunan.cn/categories/%E4%BA%91%E7%B3%BB%E7%BB%9F%E7%BB%B4%E6%8A%A4/"/>
    
    
    <category term="Ansible" scheme="http://www.ifunan.cn/tags/Ansible/"/>
    
  </entry>
  
</feed>
