<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>suke`s Notice</title>
  
  <subtitle>我的代码笔记</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://sukeai.netlify.com/"/>
  <updated>2020-12-10T01:56:27.167Z</updated>
  <id>https://sukeai.netlify.com/</id>
  
  <author>
    <name>suke</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>程序员弯路指南关于-关于android😭-我在网上瞎逼学的日常</title>
    <link href="https://sukeai.netlify.com/2020-12-10/%E7%A8%8B%E5%BA%8F%E5%91%98%E5%BC%AF%E8%B7%AF%E6%8C%87%E5%8D%97%E5%85%B3%E4%BA%8E-%E5%85%B3%E4%BA%8Eandroid%F0%9F%98%AD-%E6%88%91%E5%9C%A8%E7%BD%91%E4%B8%8A%E7%9E%8E%E9%80%BC%E5%AD%A6%E7%9A%84%E6%97%A5%E5%B8%B8.html"/>
    <id>https://sukeai.netlify.com/2020-12-10/%E7%A8%8B%E5%BA%8F%E5%91%98%E5%BC%AF%E8%B7%AF%E6%8C%87%E5%8D%97%E5%85%B3%E4%BA%8E-%E5%85%B3%E4%BA%8Eandroid%F0%9F%98%AD-%E6%88%91%E5%9C%A8%E7%BD%91%E4%B8%8A%E7%9E%8E%E9%80%BC%E5%AD%A6%E7%9A%84%E6%97%A5%E5%B8%B8.html</id>
    <published>2020-12-10T08:55:26.000Z</published>
    <updated>2020-12-10T01:56:27.167Z</updated>
    
    <content type="html"><![CDATA[<h1 id="First-ADB-基础-，测试设备"><a href="#First-ADB-基础-，测试设备" class="headerlink" title="First . ADB 基础 ，测试设备"></a>First . ADB 基础 ，测试设备</h1><p>这个在之前疯狂刷机的年纪学的，零零散散的没有具体的文档了，因为用的 android studio 所以直接找到相关目录加入环境变量即可’</p><figure class="highlight bash"><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="comment"># 常用命令</span></span><br><span class="line">adb devices <span class="comment">#列出已链接的设备</span></span><br><span class="line">adb connect 192.168.0.xx:5555 <span class="comment">#链接局域网的设备</span></span><br></pre></td></tr></table></figure><p><img src="https://tva1.sinaimg.cn/large/0081Kckwgy1glihfjm9bvj31tk0lkq6d.jpg" alt></p><p>测试手机用的小米 note3，miui 开始慢慢限制权限了，所以刷了个魔趣的系统，开启开发者模式之后，可以在开发者模式里找到 网络 adb 开启</p><h3 id="！跑题，关于刷机的步骤-非必要"><a href="#！跑题，关于刷机的步骤-非必要" class="headerlink" title="！跑题，关于刷机的步骤 非必要"></a>！跑题，关于刷机的步骤 非必要</h3><p>Twrp 下载 <a href="https://twrp.me/Devices/" target="_blank" rel="noopener">https://twrp.me/Devices/</a><br>魔趣 ROM <a href="https://download.mokeedev.com/" target="_blank" rel="noopener">https://download.mokeedev.com/</a></p><figure class="highlight bash"><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><span class="line"><span class="comment"># 使用命令行刷机</span></span><br><span class="line"><span class="comment"># ！需提前确认相关机型如何解bl锁，国内厂商很多不开启了，小米需要在官网 http://www.miui.com/unlock/index.html 开启</span></span><br><span class="line"><span class="comment"># 1.使用usb链接</span></span><br><span class="line">adb reboot bootloader</span><br><span class="line"><span class="comment"># 2.进入fastboot开发模式后 先刷入recover</span></span><br><span class="line">fastboot flash recovery twrp-2.8.x.x-xxx.img</span><br><span class="line"><span class="comment"># 重启后进入rec模式，小米是按住开机和音量+</span></span><br><span class="line">fastboot reboot</span><br><span class="line"><span class="comment"># 进入rec模式后,adb发送系统镜像</span></span><br><span class="line">adb push /xxxx/xxx.img /sdcard/</span><br><span class="line"><span class="comment"># more twrp卡刷，清除分区（某些时候需要重启下再安装），返回首页安装，找到镜像刷入即可</span></span><br></pre></td></tr></table></figure><p>下一步使用 <code>adb connect 192.168.0.xx:5555</code> 链接局域网设备。 天下苦（type c 的接口一直掉）已久 😂</p><h1 id="Second-新建项目"><a href="#Second-新建项目" class="headerlink" title="Second . 新建项目"></a>Second . 新建项目</h1><p><img src="https://tva1.sinaimg.cn/large/0081Kckwgy1glii24w68aj313u0u00tn.jpg" alt></p><h1 id="Third-build-Gradle-配置"><a href="#Third-build-Gradle-配置" class="headerlink" title="Third . build.Gradle 配置"></a>Third . build.Gradle 配置</h1><p>看的 <a href="https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android" target="_blank" rel="noopener">uniapp adnroid 本地打包</a> 的文档</p><figure class="highlight gradle"><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><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//声明项目是一个app</span></span><br><span class="line">plugins &#123;</span><br><span class="line">    id <span class="string">'com.android.application'</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//构建配置</span></span><br><span class="line">android &#123;</span><br><span class="line">    <span class="comment">//项目签名</span></span><br><span class="line">    signingConfigs &#123;</span><br><span class="line">        jks &#123;</span><br><span class="line">            storeFile <span class="keyword">file</span>(<span class="string">'xx.jks'</span>)</span><br><span class="line">            storePassword <span class="string">'xx'</span></span><br><span class="line">            keyAlias <span class="string">'xx'</span></span><br><span class="line">            keyPassword <span class="string">'xxx'</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    compileSdkVersion <span class="number">30</span></span><br><span class="line">    buildToolsVersion <span class="string">"30.0.2"</span></span><br><span class="line"></span><br><span class="line">    defaultConfig &#123;</span><br><span class="line">        <span class="comment">//包名</span></span><br><span class="line">        applicationId <span class="string">"com.rtg.test"</span></span><br><span class="line">        <span class="comment">//最小支持版本 ，小于这个版本的无法安装app</span></span><br><span class="line">        minSdkVersion <span class="number">19</span></span><br><span class="line">        <span class="comment">//目标版本 ，上架市场指定 现在一般是28</span></span><br><span class="line">        targetSdkVersion <span class="number">30</span></span><br><span class="line">        <span class="comment">//版本号 市场判断升级</span></span><br><span class="line">        versionCode <span class="number">1</span></span><br><span class="line">        versionName <span class="string">"1.0"</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">//引用依赖过多之后报了一个错误 无法编译 需要开启这个</span></span><br><span class="line">        multiDexEnabled <span class="keyword">true</span></span><br><span class="line">        <span class="comment">//指定内核</span></span><br><span class="line">        ndk &#123;</span><br><span class="line">            abiFilters <span class="string">'x86'</span>,<span class="string">'armeabi-v7a'</span></span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">//默认的 还是没入测试的门</span></span><br><span class="line">        testInstrumentationRunner <span class="string">"androidx.test.runner.AndroidJUnitRunner"</span></span><br><span class="line">        <span class="comment">//签名app</span></span><br><span class="line">        signingConfig signingConfigs.jks</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//默认</span></span><br><span class="line">    buildTypes &#123; ... &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//使用uniapp时，需复制下面代码</span></span><br><span class="line">    <span class="comment">/*代码开始*/</span></span><br><span class="line">    aaptOptions &#123;</span><br><span class="line">        additionalParameters <span class="string">'--auto-add-overlay'</span></span><br><span class="line">        <span class="comment">//noCompress 'foo', 'bar'</span></span><br><span class="line">        ignoreAssetsPattern <span class="string">"!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">/*代码结束*/</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">//指定java版本</span></span><br><span class="line">    compileOptions &#123;</span><br><span class="line">        <span class="keyword">sourceCompatibility</span> JavaVersion.VERSION_1_8</span><br><span class="line">        <span class="keyword">targetCompatibility</span> JavaVersion.VERSION_1_8</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">repositories</span> &#123;</span><br><span class="line">    <span class="keyword">flatDir</span>(</span><br><span class="line">            dirs: <span class="string">"libs"</span></span><br><span class="line">    )</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">dependencies</span> &#123;</span><br><span class="line">    <span class="comment">//引用依赖  就学会一个 filetree 挺好用的</span></span><br><span class="line">    implementation <span class="keyword">fileTree</span>(dir: <span class="string">"libs"</span>,<span class="keyword">includes</span>: [<span class="string">"*.aar"</span>,<span class="string">"*.jar"</span>])</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="Fourth-AndroidManifest-xml"><a href="#Fourth-AndroidManifest-xml" class="headerlink" title="Fourth . AndroidManifest.xml"></a>Fourth . AndroidManifest.xml</h1><figure class="highlight xml"><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><span class="line"><span class="meta">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">manifest</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></span></span><br><span class="line"><span class="tag">    <span class="attr">package</span>=<span class="string">"com.rtg.test"</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!-- 申请权限 --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">uses-permission</span> <span class="attr">android:name</span>=<span class="string">"android.permission.CAMERA"</span> /&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">application</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:allowBackup</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:icon</span>=<span class="string">"@mipmap/ic_launcher"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:label</span>=<span class="string">"@string/app_name"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:roundIcon</span>=<span class="string">"@mipmap/ic_launcher_round"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:supportsRtl</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">android:theme</span>=<span class="string">"@style/Theme.Test"</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">&lt;!-- 默认视图 --&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">activity</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:name</span>=<span class="string">".MainActivity"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:label</span>=<span class="string">"@string/app_name"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:theme</span>=<span class="string">"@style/TranslucentTheme"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:screenOrientation</span>=<span class="string">"user"</span></span></span><br><span class="line"><span class="tag">            <span class="attr">android:windowSoftInputMode</span>=<span class="string">"adjustResize"</span> &gt;</span></span><br><span class="line">            <span class="comment">&lt;!-- 应该是设置为主窗口 --&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">"android.intent.action.MAIN"</span> /&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">category</span> <span class="attr">android:name</span>=<span class="string">"android.intent.category.LAUNCHER"</span> /&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">activity</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">application</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">manifest</span>&gt;</span></span><br></pre></td></tr></table></figure><h1 id="More"><a href="#More" class="headerlink" title="More ."></a>More .</h1><h2 id="Android-文档"><a href="#Android-文档" class="headerlink" title="Android 文档"></a>Android 文档</h2><p><a href="https://developer.android.com/guide/components/fundamentals?hl=zh-cn" target="_blank" rel="noopener">https://developer.android.com/guide/components/fundamentals?hl=zh-cn</a><br>官方文档挺清晰的，就是没耐心看完</p><h2 id="UniApp-原生扩展加-alipay-的-demo-没-UI-的，安卓画界面的方式还是没搞懂"><a href="#UniApp-原生扩展加-alipay-的-demo-没-UI-的，安卓画界面的方式还是没搞懂" class="headerlink" title="UniApp 原生扩展加 alipay 的 demo,没 UI 的，安卓画界面的方式还是没搞懂"></a>UniApp 原生扩展加 alipay 的 demo,没 UI 的，安卓画界面的方式还是没搞懂</h2><p>支付宝文档：<a href="https://opendocs.alipay.com/open/204/105296" target="_blank" rel="noopener">https://opendocs.alipay.com/open/204/105296</a></p><p><code>import io.dcloud.feature.uniapp</code> 的包是在 <a href="https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android" target="_blank" rel="noopener">uniapp adnroid 本地打包</a> 下的 sdk 里 <code>uniapp-v8-release.aar</code></p><figure class="highlight java"><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><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.rtg.mylibrary;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.annotation.SuppressLint;</span><br><span class="line"><span class="keyword">import</span> android.app.Activity;</span><br><span class="line"><span class="keyword">import</span> android.os.Bundle;</span><br><span class="line"><span class="keyword">import</span> android.os.Handler;</span><br><span class="line"><span class="keyword">import</span> android.os.Message;</span><br><span class="line"><span class="keyword">import</span> android.text.TextUtils;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alipay.sdk.app.AuthTask;</span><br><span class="line"><span class="keyword">import</span> com.alipay.sdk.app.EnvUtils;</span><br><span class="line"><span class="keyword">import</span> com.alipay.sdk.app.PayTask;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> io.dcloud.feature.uniapp.annotation.UniJSMethod;</span><br><span class="line"><span class="keyword">import</span> io.dcloud.feature.uniapp.bridge.UniJSCallback;</span><br><span class="line"><span class="keyword">import</span> io.dcloud.feature.uniapp.common.UniModule;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// UniModule 声明为可以在uni原生模块中调用</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Pay</span> <span class="keyword">extends</span> <span class="title">UniModule</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@UniJSMethod</span> <span class="comment">//声明一个js可以调用的方法</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">sayHello</span><span class="params">(String tag)</span> </span>&#123;</span><br><span class="line">        System.out.println(<span class="string">"hello uni module!"</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// private final int SDK_PAY_FLAG = 1; //没用到，基于官方到sdk改了</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 设置沙箱变量，是一个常量，所以如果不写else部分，下一次调用还是沙箱</span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">isSandBox</span><span class="params">(Boolean sandbox)</span></span>&#123;</span><br><span class="line">        <span class="keyword">if</span>(sandbox)&#123;</span><br><span class="line">            EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);</span><br><span class="line">        &#125;<span class="keyword">else</span> &#123;</span><br><span class="line">            EnvUtils.setEnv(EnvUtils.EnvEnum.ONLINE);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="meta">@UniJSMethod</span>(uiThread = <span class="keyword">true</span>)</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">AliPay</span><span class="params">(String orderInfo,Boolean sandbox, UniJSCallback callBack)</span></span>&#123;</span><br><span class="line"></span><br><span class="line">        <span class="comment">//是个常量，需要重写 大意了就没有闪</span></span><br><span class="line">        <span class="keyword">this</span>.isSandBox(sandbox);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// mUniSDKInstance.getContext() 获取到uni的当前Activity</span></span><br><span class="line">        <span class="keyword">if</span>(mUniSDKInstance.getContext() <span class="keyword">instanceof</span> Activity)&#123;</span><br><span class="line">            <span class="keyword">final</span> Activity activity = (Activity) mUniSDKInstance.getContext();</span><br><span class="line">             Map&lt;String,Object&gt; jsCallbackResult = <span class="keyword">new</span> HashMap&lt;&gt;();</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 声明一个新的Runnable 用于下一步开启线程</span></span><br><span class="line">            Runnable payRunnable = <span class="keyword">new</span> Runnable() &#123;</span><br><span class="line">                <span class="meta">@Override</span></span><br><span class="line">                <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>&#123;</span><br><span class="line">                   <span class="keyword">try</span>&#123;</span><br><span class="line">                       PayTask task = <span class="keyword">new</span> PayTask(activity);</span><br><span class="line">                       String result = task.pay(orderInfo,<span class="keyword">true</span>);</span><br><span class="line">                    <span class="comment">//    需要在当前 Activity 启动线程 回调处理结果，否则会造成cash</span></span><br><span class="line">                       activity.runOnUiThread(<span class="keyword">new</span> Runnable() &#123;</span><br><span class="line">                           <span class="meta">@Override</span></span><br><span class="line">                           <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>&#123;</span><br><span class="line">                               jsCallbackResult.put(<span class="string">"result"</span>,result);</span><br><span class="line">                              <span class="keyword">if</span>(callBack!=<span class="keyword">null</span>)callBack.invoke(jsCallbackResult);</span><br><span class="line">                           &#125;</span><br><span class="line">                       &#125;);</span><br><span class="line">                   &#125;<span class="keyword">catch</span>(<span class="keyword">final</span> Exception err)&#123;</span><br><span class="line">                       activity.runOnUiThread(<span class="keyword">new</span> Runnable() &#123;</span><br><span class="line">                           <span class="meta">@Override</span></span><br><span class="line">                           <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>&#123;</span><br><span class="line">                               jsCallbackResult.put(<span class="string">"exception"</span>,err);</span><br><span class="line">                               <span class="keyword">if</span>(callBack!=<span class="keyword">null</span>)callBack.invoke(jsCallbackResult);</span><br><span class="line">                           &#125;</span><br><span class="line">                       &#125;);</span><br><span class="line">                        System.out.println(<span class="string">"支付失败"</span>+err);</span><br><span class="line">                   &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 启动线程，线程用完即自动结束 不需要手动关闭</span></span><br><span class="line">            Thread _thread = <span class="keyword">new</span> Thread(payRunnable);</span><br><span class="line">            _thread.start();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;First-ADB-基础-，测试设备&quot;&gt;&lt;a href=&quot;#First-ADB-基础-，测试设备&quot; class=&quot;headerlink&quot; title=&quot;First . ADB 基础 ，测试设备&quot;&gt;&lt;/a&gt;First . ADB 基础 ，测试设备&lt;/h1&gt;&lt;p&gt;这个
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>程序员弯路指南-迫于无聊,入门了一下 swiftui 开发</title>
    <link href="https://sukeai.netlify.com/2020-10-24/%E7%A8%8B%E5%BA%8F%E5%91%98%E5%BC%AF%E8%B7%AF%E6%8C%87%E5%8D%97-%E8%BF%AB%E4%BA%8E%E6%97%A0%E8%81%8A,%E5%85%A5%E9%97%A8%E4%BA%86%E4%B8%80%E4%B8%8Bswiftui%E5%BC%80%E5%8F%91.html"/>
    <id>https://sukeai.netlify.com/2020-10-24/%E7%A8%8B%E5%BA%8F%E5%91%98%E5%BC%AF%E8%B7%AF%E6%8C%87%E5%8D%97-%E8%BF%AB%E4%BA%8E%E6%97%A0%E8%81%8A,%E5%85%A5%E9%97%A8%E4%BA%86%E4%B8%80%E4%B8%8Bswiftui%E5%BC%80%E5%8F%91.html</id>
    <published>2020-10-24T09:08:35.000Z</published>
    <updated>2020-10-24T02:00:33.241Z</updated>
    
    <content type="html"><![CDATA[<p>上一篇文章写了点开发板的记录，基础刚刚看完，下一步需要搞焊接了，没买装备，暂时放下了，</p><p>最近莫名想着搞独立开发了，找了各种方向还是觉得做 apple store 的 app 会比较合适，于是拿着 ios14 上线之后很火的 widget 做了些练习，这里记录一下</p><h2 id="学习目标"><a href="#学习目标" class="headerlink" title="学习目标"></a>学习目标</h2><p>想要用于开发 widget，app 的主要内容还是倾向于使用 flutter</p><h2 id="基础语法"><a href="#基础语法" class="headerlink" title="基础语法"></a>基础语法</h2><p>这个还没细看，基于 xcode 代码提示和实际问题开始的</p><h2 id="入门文档"><a href="#入门文档" class="headerlink" title="入门文档"></a>入门文档</h2><p><a href="https://developer.apple.com/tutorials/swiftui/" target="_blank" rel="noopener">官方手把手教学 立即开始做一个简单 app</a></p><p><a href="https://developer.apple.com/cn/swift/resources/" target="_blank" rel="noopener">swift 官方文档资源</a></p><p><a href="https://medium.com/%E5%BD%BC%E5%BE%97%E6%BD%98%E7%9A%84-swift-ios-app-%E9%96%8B%E7%99%BC%E5%95%8F%E9%A1%8C%E8%A7%A3%E7%AD%94%E9%9B%86/swiftui-%E7%A8%8B%E5%BC%8F%E9%96%8B%E7%99%BC%E5%88%9D%E9%AB%94%E9%A9%97-aea9122741b1" target="_blank" rel="noopener">SwiftUI 程式開發初體驗 medium.com </a> 这是我找到的一个，官方的虽然交互漂亮，但是有点太慢了</p><p><a href="https://onevcat.com/" target="_blank" rel="noopener">https://onevcat.com/ 猫神 似乎是个大咖 出过相关的开发书籍</a></p><h2 id="遇到的问题-解决记录"><a href="#遇到的问题-解决记录" class="headerlink" title="遇到的问题 解决记录"></a>遇到的问题 解决记录</h2><h3 id="打开-xcode-找不到组件属性面板"><a href="#打开-xcode-找不到组件属性面板" class="headerlink" title="打开 xcode 找不到组件属性面板"></a>打开 xcode 找不到组件属性面板</h3><p>因为 xcode11 之后支持了 canvas 实时预览组件，这个属性面板跟随了 canvas 的显示和隐藏，</p><p><img src="https://tva1.sinaimg.cn/large/0081Kckwgy1gk05ufl3euj30uq0lqq3z.jpg" alt><br>右上角点击+号有一个选择组件可以直接拖放的面板，也跟随了这个设置</p><h3 id="swift-ui-自动撑开父组件"><a href="#swift-ui-自动撑开父组件" class="headerlink" title="swift ui 自动撑开父组件"></a>swift ui 自动撑开父组件</h3><p>和 flutter 一样，swift ui 常用布局组件类似 html 的<code>display:flex</code> ，但是没有实现类型<code>flex：1</code>的属性</p><p>需要使用一个 Spacer 的组件撑开剩余的空间<br><img src="https://tva1.sinaimg.cn/large/0081Kckwgy1gk05yx1ha7j30i609e0sv.jpg" alt></p><h3 id="CocoaPods-使用"><a href="#CocoaPods-使用" class="headerlink" title="CocoaPods 使用"></a>CocoaPods 使用</h3><p>1.安装 <a href="https://cocoapods.org/" target="_blank" rel="noopener">https://cocoapods.org/</a></p><p>2.使用<code>pod init</code>在工作目录进行初始化，之后打开<code>Profile</code>文件编辑</p><figure class="highlight elixir"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># Uncomment the next line to define a global platform for your project</span></span><br><span class="line"><span class="comment"># 指定ios版本</span></span><br><span class="line">platform <span class="symbol">:ios</span>, <span class="string">'10.0'</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 因为我需要在 app 和 widget 同时使用，所以直接全局安装了</span></span><br><span class="line">pod <span class="string">'Alamofire'</span>, <span class="string">'~&gt; 5.2'</span></span><br><span class="line">pod <span class="string">'SwiftyJSON'</span></span><br><span class="line"></span><br><span class="line">target <span class="string">'infoExtension'</span> <span class="keyword">do</span></span><br><span class="line">  <span class="comment"># Comment the next line if you don't want to use dynamic frameworks</span></span><br><span class="line">  use_frameworks!</span><br><span class="line">  <span class="comment"># 在这里安装需要的库</span></span><br><span class="line">  <span class="comment"># Pods for infoExtension</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line">target <span class="string">'v2widget'</span> <span class="keyword">do</span></span><br><span class="line">  <span class="comment"># Comment the next line if you don't want to use dynamic frameworks</span></span><br><span class="line">  use_frameworks!</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Pods for v2widget</span></span><br><span class="line"></span><br><span class="line">  target <span class="string">'v2widgetTests'</span> <span class="keyword">do</span></span><br><span class="line">    inherit! <span class="symbol">:search_paths</span></span><br><span class="line">    <span class="comment"># Pods for testing</span></span><br><span class="line">  <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line">  target <span class="string">'v2widgetUITests'</span> <span class="keyword">do</span></span><br><span class="line">    <span class="comment"># Pods for testing</span></span><br><span class="line">  <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><p>3.编辑完成之后，返回命令行在工作目录执行 <code>pod install </code>安装 4.安装完成之后需要关闭 xcode,找到工作目录，打开 workspace 文件，这个是 pod 新建的，包含了下载的库<br><img src="https://tva1.sinaimg.cn/large/0081Kckwgy1gk068v86yhj30ok0bi3yx.jpg" alt></p><h3 id="request-网络请求-需要用到一个-Alamofire-的库"><a href="#request-网络请求-需要用到一个-Alamofire-的库" class="headerlink" title="request 网络请求(需要用到一个 Alamofire 的库"></a>request 网络请求(需要用到一个 Alamofire 的库</h3><p>上一段已经安装了需要的库<br>最新版本的 Alamofire 不能直接使用 Alamofire.request 调用，而是声明了一个 AF 的命名空间<br>使用是类似 <code>AF.request(url)</code></p><figure class="highlight swift"><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="comment">//声明url !在某些场景下表示必须实现类型</span></span><br><span class="line"><span class="keyword">let</span> url = <span class="type">URL</span>(string: <span class="string">"https://www.xxxx.com/api/members/show.json?username=suke971219"</span>)!</span><br><span class="line"></span><br><span class="line"><span class="comment">//responseJSON 表示返回json类型 还支持string及其他类型</span></span><br><span class="line"><span class="keyword">var</span> user:<span class="type">User</span>;</span><br><span class="line"><span class="type">AF</span>.request(url,method: <span class="type">HTTPMethod</span>.<span class="keyword">get</span>).responseJSON&#123;</span><br><span class="line">            response <span class="keyword">in</span></span><br><span class="line">            <span class="comment">// response in 相当于 (response)=&gt;&#123;&#125; 但是不知道为什么这里不需要大括号&#123;&#125;</span></span><br><span class="line">            <span class="keyword">switch</span> (response.result)&#123;</span><br><span class="line">            <span class="keyword">case</span> .success(<span class="keyword">let</span> json):</span><br><span class="line">                <span class="built_in">print</span>(json )<span class="comment">//这里的json应该已经转换了 但是是一个Any类型，下一步类型强转</span></span><br><span class="line">                <span class="keyword">let</span> dict = json <span class="keyword">as</span>! <span class="type">Dictionary</span>&lt;<span class="type">String</span>,<span class="type">AnyObject</span>&gt;</span><br><span class="line">                user = <span class="type">User</span>(json:dict)</span><br><span class="line">                <span class="built_in">print</span>(user)</span><br><span class="line">            <span class="keyword">case</span> .failure(<span class="keyword">let</span> err):</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">"error \(err)"</span>)</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure><h3 id="Dictionary-到一个实际的-model（直接使用字典类型似乎不是一个好习惯"><a href="#Dictionary-到一个实际的-model（直接使用字典类型似乎不是一个好习惯" class="headerlink" title="Dictionary 到一个实际的 model（直接使用字典类型似乎不是一个好习惯"></a>Dictionary 到一个实际的 model（直接使用字典类型似乎不是一个好习惯</h3><p>我找了很多，推荐的都是<a href="https://github.com/alibaba/HandyJSON" target="_blank" rel="noopener">HandyJSON</a> <a href="https://github.com/SwiftyJSON/SwiftyJSON" target="_blank" rel="noopener">SwiftyJSON</a> 以及一些其他的框架，但是我使用 pod 安装的时候遇到了一个 swift 版本的问题，我有必须使用最新版本的强迫症，所以没有继续</p><p>这是一个简单的例子，在上一段中我们传入了一个 Dictionary 类型的字典，可以直接在初始化的阶段给对象赋值</p><figure class="highlight swift"><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="keyword">public</span> <span class="class"><span class="keyword">struct</span> <span class="title">User</span> </span>&#123;</span><br><span class="line">    <span class="keyword">var</span> username:<span class="type">String?</span></span><br><span class="line">    <span class="keyword">var</span> website:<span class="type">String?</span></span><br><span class="line">    <span class="keyword">var</span> github:<span class="type">String?</span></span><br><span class="line">    <span class="keyword">var</span> avatar_normal:<span class="type">String?</span></span><br><span class="line">    <span class="keyword">var</span> url:<span class="type">String?</span></span><br><span class="line">    <span class="keyword">var</span> created:<span class="type">Int?</span></span><br><span class="line">    <span class="keyword">var</span> location:<span class="type">String?</span></span><br><span class="line">    <span class="keyword">var</span> id:<span class="type">Int?</span></span><br><span class="line">    <span class="keyword">var</span> day:<span class="type">String?</span></span><br><span class="line">    <span class="keyword">var</span> twitter:<span class="type">String?</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">init</span>(json: <span class="type">Dictionary</span>&lt;<span class="type">String</span>, <span class="type">Any</span>&gt;)&#123;</span><br><span class="line">        <span class="keyword">self</span>.username = json[<span class="string">"username"</span>] <span class="keyword">as</span>? <span class="type">String</span></span><br><span class="line">        <span class="keyword">self</span>.website = json[<span class="string">"website"</span>] <span class="keyword">as</span>? <span class="type">String</span></span><br><span class="line">        <span class="keyword">self</span>.github = json[<span class="string">"github"</span>] <span class="keyword">as</span>? <span class="type">String</span></span><br><span class="line">        <span class="keyword">self</span>.avatar_normal = json[<span class="string">"avatar_normal"</span>] <span class="keyword">as</span>? <span class="type">String</span></span><br><span class="line">        <span class="keyword">self</span>.created = json[<span class="string">"created"</span>] <span class="keyword">as</span>? <span class="type">Int</span></span><br><span class="line">        <span class="keyword">self</span>.location = json[<span class="string">"location"</span>] <span class="keyword">as</span>? <span class="type">String</span></span><br><span class="line">        <span class="keyword">self</span>.id = json[<span class="string">"id"</span>] <span class="keyword">as</span>? <span class="type">Int</span></span><br><span class="line">        <span class="keyword">self</span>.twitter = json[<span class="string">"twitter"</span>] <span class="keyword">as</span>? <span class="type">String</span></span><br><span class="line">        <span class="keyword">self</span>.day = timeStampToCurrennTime(timeStamp: <span class="type">Double</span>(<span class="keyword">self</span>.created ?? <span class="number">0</span>))</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="一个转换时间戳的小工具"><a href="#一个转换时间戳的小工具" class="headerlink" title="一个转换时间戳的小工具"></a>一个转换时间戳的小工具</h3><p><a href="https://juejin.im/post/6844903796141735950" target="_blank" rel="noopener">掘金-swift 时间戳与时间相互转化</a></p><h3 id="模块间相互引用"><a href="#模块间相互引用" class="headerlink" title="模块间相互引用"></a>模块间相互引用</h3><p>你可以新建一个目录创建一些工具类的文件，并且只要在文件属性的 target 指定相关的模块就可以直接引用了</p><p><img src="https://tva1.sinaimg.cn/large/0081Kckwgy1gk06tto0urj31f70u0tfh.jpg" alt></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;上一篇文章写了点开发板的记录，基础刚刚看完，下一步需要搞焊接了，没买装备，暂时放下了，&lt;/p&gt;
&lt;p&gt;最近莫名想着搞独立开发了，找了各种方向还是觉得做 apple store 的 app 会比较合适，于是拿着 ios14 上线之后很火的 widget 做了些练习，这里记录一
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>最近学习esp32开发板的一些记录</title>
    <link href="https://sukeai.netlify.com/2020-10-19/%E6%9C%80%E8%BF%91%E5%AD%A6%E4%B9%A0esp32%E5%BC%80%E5%8F%91%E6%9D%BF%E7%9A%84%E4%B8%80%E4%BA%9B%E8%AE%B0%E5%BD%95.html"/>
    <id>https://sukeai.netlify.com/2020-10-19/%E6%9C%80%E8%BF%91%E5%AD%A6%E4%B9%A0esp32%E5%BC%80%E5%8F%91%E6%9D%BF%E7%9A%84%E4%B8%80%E4%BA%9B%E8%AE%B0%E5%BD%95.html</id>
    <published>2020-10-19T09:31:12.000Z</published>
    <updated>2020-10-19T02:41:43.387Z</updated>
    
    <content type="html"><![CDATA[<table><thead><tr><th align="left"></th><th align="right"></th></tr></thead><tbody><tr><td align="left">开发环境</td><td align="right">macOS Big Sur 11.0 Beta 版(20A5395g)</td></tr><tr><td align="left">设备型号</td><td align="right">nodemcu 32s</td></tr></tbody></table><h3 id="esp32-的开发"><a href="#esp32-的开发" class="headerlink" title="esp32 的开发"></a>esp32 的开发</h3><p>最近心血来潮，买了块 esp32 的开发板，使用的 arduino 框架，需要使用到 c++，还没专门学习，主要考 arduino 的 demo 代码片段了解一些基础语法，方向还是了解 esp 开发相关的，暂不准备深度 c++ 相关</p><p>主要实验了 tinygo，micropython, idf(官方套件),esp-arduino （有一个共同的问题就是这些项目都共同依赖了 esptool.py 和 serial.py ,在 macos Big Sur 中因为一个系统依赖的改变导致自动查找端口的方法失败，需要注释掉一段代码，并且指定端口 <a href="https://github.com/pyserial/pyserial/issues/509" target="_blank" rel="noopener">issues https://github.com/pyserial/pyserial/issues/509</a></p><h4 id="tinygo"><a href="#tinygo" class="headerlink" title="tinygo"></a>tinygo</h4><p>比较喜欢 go 语言，因此首选的考虑这个，但是仅支持了 gpio ipc ℹ2c 接口，没有 wifi 和蓝牙模块，所以暂时放弃了</p><p>环境配置：<a href="https://tinygo.org/getting-started/macos/" target="_blank" rel="noopener">https://tinygo.org/getting-started/macos/</a></p><p>vscode 扩展 <a href="https://marketplace.visualstudio.com/items?itemName=tinygo.vscode-tinygo" target="_blank" rel="noopener">tinygo.vscode-tinygo</a></p><p>vscode 中需要设置一下工作区配置，设置 goroot 和 gopath</p><p>tinygo 实现了 flash 方法不需要依赖 esptool，<code>tinygo flash -target=esp32-wroom-32 -port=/dev/ttyUSB0 examples/blinky1<br></code> 指定 target 的时候 tinygo 会检测是否存在指定的硬件</p><h4 id="micropython"><a href="#micropython" class="headerlink" title="micropython"></a>micropython</h4><p>这个实现相对完善的，并且支持了串口 repl 和 webscket 网络 repl，但是没有找到比较合适的软件，最开始只能在命令行执行 python 命令，开启 wifi 和网络 repl，之后可以使用网络 repl 上传文件</p><p>推荐一个 <a href="https://thonny.org/" target="_blank" rel="noopener">thonny</a> 的软件，支持指定 python 解释器和自动链接到串口 repl （使用 screen 链接是总是会占用串口，提示 busy，这个软件很合适）并且支持了一个简单的文件系统，可以直接选择开发板中的文件进行编辑</p><p>另外找到一个 1zlab 开发的 web ide <a href="http://www.1zlab.com/wiki/micropython-esp32/" target="_blank" rel="noopener">http://www.1zlab.com/wiki/micropython-esp32/</a> (这里也有一些 micropython 开发的教程和硬件基础知识，算是比较容易懂的)，扩展了 web repl 的使用，看起来很方便，但是没有部署成功，项目 2 年多没有更新了，并且前后端的命令有一些不兼容，可能需要修改一下（有时间可能想要 fork 这个项目维护一下</p><p>放弃的原因，一个是开发环境(还算不错的了，但是后边找到个更方便的)，另一个就是找到的资料普遍表示 micropython 性能会差一点(其实不用太介意)</p><h4 id="idf"><a href="#idf" class="headerlink" title="idf"></a>idf</h4><p><a href="https://docs.espressif.com/projects/esp-idf/en/release-v3.0/get-started/macos-setup.html" target="_blank" rel="noopener">https://docs.espressif.com/projects/esp-idf/en/release-v3.0/get-started/macos-setup.html</a></p><p>开发环境比较大，demo 的文件夹内容比较困惑，python 和 c 是混合的，似乎使用 python 完成一些构建配置，c 代码是主要内容<br>主要还是开发环境太大，下载了半天一个多 G、测试 demo 后，遂放弃</p><h4 id="arduino"><a href="#arduino" class="headerlink" title="arduino"></a>arduino</h4><p><a href="https://www.arduino.cc/" target="_blank" rel="noopener">https://www.arduino.cc/</a><br>arduino ide for mac 使用的 esptool 是一个编译后文件，无法修改替换上述的一个问题，无法链接设备</p><p><a href="https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide" target="_blank" rel="noopener">https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide</a><br>platformIO IDE for vscode ,最新使用的是这个，可以指定 arduino 和 idf 环境，有挺多的扩展库支持，vscode toolbar 自动链接，烧录，测试都很方便，难点在与 c++的学习，（代码检测和错误提示的速度有些慢</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;开发环境&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>Go Web Server上传文件实践</title>
    <link href="https://sukeai.netlify.com/2020-04-21/Server%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E5%AE%9E%E8%B7%B5.html"/>
    <id>https://sukeai.netlify.com/2020-04-21/Server%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E5%AE%9E%E8%B7%B5.html</id>
    <published>2020-04-21T15:05:28.000Z</published>
    <updated>2020-10-19T01:19:56.252Z</updated>
    
    <content type="html"><![CDATA[<!-- 文件地址 --><p><a href="https://github.com/Treblex/go-echo-demo/blob/master/server/router/router.go#L63" target="_blank" rel="noopener">https://github.com/Treblex/go-echo-demo/blob/master/server/router/router.go#L63</a></p><figure class="highlight go"><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><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">upload</span><span class="params">(c echo.Context)</span> <span class="title">error</span></span> &#123;</span><br><span class="line">file, err := c.FormFile(<span class="string">"file"</span>)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> util.JSONErr(c, err, <span class="string">"上传错误"</span>) <span class="comment">//未获取到文件流</span></span><br><span class="line">&#125;</span><br><span class="line">pathExt := path.Ext(file.Filename)</span><br><span class="line">acceptsImgExt := []<span class="keyword">interface</span>&#123;&#125;&#123;<span class="string">"jpg"</span>, <span class="string">"png"</span>, <span class="string">"jpeg"</span>, <span class="string">"webp"</span>&#125;           <span class="comment">//图片类型</span></span><br><span class="line">acceptsVideoExt := []<span class="keyword">interface</span>&#123;&#125;&#123;<span class="string">"mov"</span>, <span class="string">"mp4"</span>, <span class="string">"avi"</span>&#125;                  <span class="comment">//视频类型</span></span><br><span class="line">acceptsOtherFileExt := []<span class="keyword">interface</span>&#123;&#125;&#123;<span class="string">"pdf"</span>, <span class="string">"zip"</span>, <span class="string">"rar"</span>, <span class="string">"gz"</span>, <span class="string">"txt"</span>&#125; <span class="comment">//其他文件类型</span></span><br><span class="line">folder := <span class="string">""</span></span><br><span class="line"><span class="comment">// 如果符合类型，设定目录</span></span><br><span class="line"><span class="keyword">if</span> inArray(acceptsImgExt, strings.Trim(pathExt, <span class="string">"."</span>)) &#123;</span><br><span class="line">folder = <span class="string">"image"</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> inArray(acceptsVideoExt, strings.Trim(pathExt, <span class="string">"."</span>)) &#123;</span><br><span class="line">folder = <span class="string">"video"</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> inArray(acceptsOtherFileExt, strings.Trim(pathExt, <span class="string">"."</span>)) &#123;</span><br><span class="line">folder = <span class="string">"file"</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 如果不符合任何一种类型</span></span><br><span class="line"><span class="keyword">if</span> folder == <span class="string">""</span> &#123;</span><br><span class="line"><span class="keyword">return</span> util.JSONErr(c, <span class="literal">nil</span>, <span class="string">"文件不合法"</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 打开文件流</span></span><br><span class="line">src, err := file.Open()</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> util.JSONErr(c, err, <span class="string">"打开文件失败"</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">defer</span> src.Close() <span class="comment">//函数结束时自动关闭文件</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//创建文件夹</span></span><br><span class="line">dir, err := getDir(<span class="string">"./static/upload/"</span>+folder+<span class="string">"/"</span>, time.Now().Format(<span class="string">"2006_01_02"</span>))</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> util.JSONErr(c, err, <span class="string">"创建文件夹失败"</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 随机文件名 + 文件后缀</span></span><br><span class="line">randName := util.RandStringBytes(<span class="number">32</span>) + pathExt</span><br><span class="line"><span class="comment">// Destination</span></span><br><span class="line">fileName := filepath.Join(dir, randName)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建空文件</span></span><br><span class="line">dst, err := os.Create(fileName)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> util.JSONErr(c, err, <span class="string">"创建文件失败"</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">defer</span> dst.Close()</span><br><span class="line"><span class="comment">// Copy文件流到新建到文件</span></span><br><span class="line"><span class="keyword">if</span> _, err = io.Copy(dst, src); err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> util.JSONErr(c, err, <span class="string">"拷贝文件至目标失败"</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 拼接文件地址，不带协议头，方便处理http 到https升级 ， 其实也没找到协议头在哪儿，req对象里没有返回到空字符串</span></span><br><span class="line"><span class="keyword">return</span> util.JSON(c, fmt.Sprintf(<span class="string">"//%s/%s"</span>, c.Request().Host, fileName), <span class="string">"上传成功"</span>, <span class="number">200</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建文件夹</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">getDir</span><span class="params">(path <span class="keyword">string</span>, foderName <span class="keyword">string</span>)</span> <span class="params">(dir <span class="keyword">string</span>, err error)</span></span> &#123;</span><br><span class="line">folder := filepath.Join(path, foderName)</span><br><span class="line"><span class="keyword">if</span> _, err = os.Stat(folder); os.IsNotExist(err) &#123;</span><br><span class="line">err = os.MkdirAll(folder, os.ModePerm)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">dir = folder</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 在数组中</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">inArray</span><span class="params">(arr []<span class="keyword">interface</span>&#123;&#125;, item <span class="keyword">interface</span>&#123;&#125;)</span> <span class="params">(inArr <span class="keyword">bool</span>)</span></span> &#123;</span><br><span class="line">index := <span class="number">-1</span></span><br><span class="line"><span class="keyword">for</span> i, x := <span class="keyword">range</span> arr &#123;</span><br><span class="line"><span class="keyword">if</span> item == x &#123;</span><br><span class="line">index = i</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> index &gt; <span class="number">-1</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;!-- 文件地址 --&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Treblex/go-echo-demo/blob/master/server/router/router.go#L63&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ht
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>Flutter开发日记-侧滑删除组件</title>
    <link href="https://sukeai.netlify.com/2020-04-07/Flutter%E5%BC%80%E5%8F%91%E6%97%A5%E8%AE%B0-%E4%BE%A7%E6%BB%91%E5%88%A0%E9%99%A4%E7%BB%84%E4%BB%B6.html"/>
    <id>https://sukeai.netlify.com/2020-04-07/Flutter%E5%BC%80%E5%8F%91%E6%97%A5%E8%AE%B0-%E4%BE%A7%E6%BB%91%E5%88%A0%E9%99%A4%E7%BB%84%E4%BB%B6.html</id>
    <published>2020-04-07T09:41:25.000Z</published>
    <updated>2020-10-19T01:19:56.251Z</updated>
    
    <content type="html"><![CDATA[<h1 id="flutter-侧滑删除组件"><a href="#flutter-侧滑删除组件" class="headerlink" title="flutter 侧滑删除组件"></a>flutter 侧滑删除组件</h1><p>文件地址 <a href="https://github.com/Treblex/go-echo-demo/blob/master/flutter_client/lib/library/SlidingEventsStatus.dart" target="_blank" rel="noopener">click here</a></p><p>这个组件现在还处于刚刚好能用的状态，问题还蛮多，就是在点击和 touch 事件的时候记录位置，处理偏移</p><p>布局使用的一个<code>Stack</code>定位组件<br><img src="https://tva1.sinaimg.cn/large/007S8ZIlgy1ge1ed7ly39j30ue0m0whi.jpg" alt><br>以及在行首定义了一个 eventbus，可以在页面调用的时候通知全局点击重置状态</p><p>需要一个 event_bus 插件支持</p><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="string">'package:event_bus/event_bus.dart'</span>;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;flutter-侧滑删除组件&quot;&gt;&lt;a href=&quot;#flutter-侧滑删除组件&quot; class=&quot;headerlink&quot; title=&quot;flutter 侧滑删除组件&quot;&gt;&lt;/a&gt;flutter 侧滑删除组件&lt;/h1&gt;&lt;p&gt;文件地址 &lt;a href=&quot;https://
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>Flutter开发日记-Image网络图片加载错误处理</title>
    <link href="https://sukeai.netlify.com/2020-04-07/Flutter%E5%BC%80%E5%8F%91%E6%97%A5%E8%AE%B0-Image%E7%BD%91%E7%BB%9C%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86.html"/>
    <id>https://sukeai.netlify.com/2020-04-07/Flutter%E5%BC%80%E5%8F%91%E6%97%A5%E8%AE%B0-Image%E7%BD%91%E7%BB%9C%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86.html</id>
    <published>2020-04-07T09:41:10.000Z</published>
    <updated>2020-10-19T01:19:56.251Z</updated>
    
    <content type="html"><![CDATA[<h1 id="自定义-ImageProvider-实现"><a href="#自定义-ImageProvider-实现" class="headerlink" title="自定义 ImageProvider 实现"></a>自定义 ImageProvider 实现</h1><p>文件 github 地址 ：<a href="https://github.com/Treblex/go-echo-demo/blob/master/flutter_client/lib/library/NetImage.dart" target="_blank" rel="noopener">click here</a></p><p>注释比较清楚，不多写了,这个主题很好看，但是代码高亮一直没啥反应</p><p>主要的方法都是和原生组件已有的，主要重写了 _loadAsync 方法（图片加载）以及 getter operator 的实现（影响底层组件判断这张图片是否使用缓存）</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;自定义-ImageProvider-实现&quot;&gt;&lt;a href=&quot;#自定义-ImageProvider-实现&quot; class=&quot;headerlink&quot; title=&quot;自定义 ImageProvider 实现&quot;&gt;&lt;/a&gt;自定义 ImageProvider 实现&lt;/h1&gt;&lt;
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>Go语言 gorm 自定义json类型</title>
    <link href="https://sukeai.netlify.com/2020-03-27/%E8%87%AA%E5%AE%9A%E4%B9%89json%E7%B1%BB%E5%9E%8B.html"/>
    <id>https://sukeai.netlify.com/2020-03-27/%E8%87%AA%E5%AE%9A%E4%B9%89json%E7%B1%BB%E5%9E%8B.html</id>
    <published>2020-03-27T11:20:34.000Z</published>
    <updated>2020-10-19T01:19:56.253Z</updated>
    
    <content type="html"><![CDATA[<h1 id="在-gorm-的-stuct-中实现自定义类型，"><a href="#在-gorm-的-stuct-中实现自定义类型，" class="headerlink" title="在 gorm 的 stuct 中实现自定义类型，"></a>在 gorm 的 stuct 中实现自定义类型，</h1><h3 id="完成，"><a href="#完成，" class="headerlink" title="完成，"></a>完成，</h3><blockquote><p>req.body=&gt;(MarshaJson json)=&gt;stuct=&gt;(Value grom.Model)=&gt;数据库</p></blockquote><blockquote><p>数据库=&gt;(Scan grom.Model)=&gt;struct=&gt;(UnmarshaJson json)=&gt;json</p></blockquote><figure class="highlight go"><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><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// Array json传数组类型 &gt;&gt;&gt;修复：</span></span><br><span class="line"><span class="keyword">type</span> Array []<span class="keyword">string</span></span><br><span class="line"><span class="comment">//gorm中声明数据模型的时候需要 Images      util.Array `gorm:"type:MEDIUMTEXT" json:"images" `</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// UnmarshalJSON req.body []byte=&gt;对象，记得调用json.Unmarshal要新建原始类型进行绑定，不如会死循环</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(a *Array)</span> <span class="title">UnmarshalJSON</span><span class="params">(b []<span class="keyword">byte</span>)</span> <span class="title">error</span></span> &#123;</span><br><span class="line"><span class="comment">// b = bytes.Trim(b, "\"")</span></span><br><span class="line"><span class="comment">// fmt.Printf("%v", string(b))</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//这里一定要新建对象</span></span><br><span class="line"><span class="comment">//json.Unmarshal调用的是 stuct.UnmarshalJSON</span></span><br><span class="line"><span class="comment">//所以这里如果直接绑定 &amp;a 会出现死循环</span></span><br><span class="line">arr := []<span class="keyword">string</span>&#123;&#125;</span><br><span class="line"><span class="keyword">if</span> err := json.Unmarshal(b, &amp;arr); err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> err <span class="comment">//如果解码失败</span></span><br><span class="line">&#125;</span><br><span class="line">*a = Array(arr) <span class="comment">//解码成功赋值</span></span><br><span class="line"><span class="comment">// fmt.Printf("Array UnmarshalJSON %v \n", arr)</span></span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Value 存库,对象到转储数据 标准字符 int类型</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(a Array)</span> <span class="title">Value</span><span class="params">()</span> <span class="params">(driver.Value, error)</span></span> &#123;</span><br><span class="line"><span class="comment">// fmt.Printf("value %v \n", a)</span></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(a) == <span class="number">0</span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span>, <span class="literal">nil</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">//fmt.Sprint(a) []string=&gt;[a,b,c] 强制转换为字符类型，类似与js中的 obj =&gt; [object,object]</span></span><br><span class="line">    <span class="comment">//strings.Trim  [a b c]=&gt;a b c</span></span><br><span class="line">    <span class="comment">//strings.ReplaceAll a b c =&gt; a,b,c</span></span><br><span class="line">arr := strings.ReplaceAll(strings.Trim(fmt.Sprint(a), <span class="string">"[]"</span>), <span class="string">" "</span>, <span class="string">","</span>)</span><br><span class="line"><span class="keyword">return</span> arr, <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Scan 绑定，数据库到对象,这里到数据取到到都是[]uint8字节，转化为对象</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(a *Array)</span> <span class="title">Scan</span><span class="params">(v <span class="keyword">interface</span>&#123;&#125;)</span> <span class="title">error</span></span> &#123;</span><br><span class="line">value, ok := v.([]<span class="keyword">uint8</span>) <span class="comment">//自定义的类型 从数据库取出，scan的时候 varchar(255)和double 获取到的都是 []uint8 字节，可能哪里还有问题，之前看的一个自定义时间格式化的可以获取到time.Time类型</span></span><br><span class="line"><span class="keyword">if</span> ok &#123;</span><br><span class="line">        <span class="comment">// 转化字节到字符串 分割字符串</span></span><br><span class="line">arr := strings.Split(<span class="keyword">string</span>(value), <span class="string">","</span>)</span><br><span class="line">*a = Array(arr)<span class="comment">//重新赋值Arr</span></span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> fmt.Errorf(<span class="string">"%v 类型错误  scan失败"</span>, reflect.TypeOf(v))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// MarshalJSON 对象到json转换 接口展示</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(a *Array)</span> <span class="title">MarshalJSON</span><span class="params">()</span> <span class="params">([]<span class="keyword">byte</span>, error)</span></span> &#123;</span><br><span class="line">    <span class="comment">//这里在scan后边执行 直接解码，注意新建通用类型</span></span><br><span class="line">b, err := json.Marshal([]<span class="keyword">string</span>(*a))</span><br><span class="line"><span class="comment">// fmt.Printf("MarshalJSON %v \n", string(b))</span></span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span>, err</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 空数组默认值，空数组返回null在前端还听难受到其实</span></span><br><span class="line"><span class="keyword">if</span> <span class="keyword">string</span>(b) == <span class="string">"null"</span> &#123;</span><br><span class="line">b = []<span class="keyword">byte</span>(<span class="string">`[]`</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> b, <span class="literal">nil</span></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><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">post</span>(<span class="string">""</span>,&#123;<span class="attribute">data</span>:&#123;<span class="attribute">arr</span>:[<span class="string">"asd"</span>,<span class="string">"asd"</span>]&#125;&#125;)</span><br></pre></td></tr></table></figure><h4 id="存库"><a href="#存库" class="headerlink" title="存库"></a>存库</h4><figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">"asd,asd"</span></span><br></pre></td></tr></table></figure><h4 id="Response"><a href="#Response" class="headerlink" title="Response"></a>Response</h4><figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">arr:</span>[<span class="string">"asd"</span>,<span class="string">"asd"</span>]</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;在-gorm-的-stuct-中实现自定义类型，&quot;&gt;&lt;a href=&quot;#在-gorm-的-stuct-中实现自定义类型，&quot; class=&quot;headerlink&quot; title=&quot;在 gorm 的 stuct 中实现自定义类型，&quot;&gt;&lt;/a&gt;在 gorm 的 stuct
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>Flutter实践</title>
    <link href="https://sukeai.netlify.com/2020-03-16/Flutter%E5%AE%9E%E8%B7%B5.html"/>
    <id>https://sukeai.netlify.com/2020-03-16/Flutter%E5%AE%9E%E8%B7%B5.html</id>
    <published>2020-03-16T12:03:44.000Z</published>
    <updated>2020-10-19T01:19:56.251Z</updated>
    
    <content type="html"><![CDATA[<h1 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h1><blockquote><ol><li>git clone <a href="https://github.com/flutter/flutter.git" target="_blank" rel="noopener">https://github.com/flutter/flutter.git</a> everyYouLike/flutter 设置环境变量指向 flutter/bin</li><li>安装 vscode vscode flutter 插件</li><li>ctrl+p 命令模式 新建 flutter project</li></ol></blockquote><p>更多内容 <a href="https://flutter.dev" target="_blank" rel="noopener">flutter.dev</a></p><h1 id="推荐教程-click-here"><a href="#推荐教程-click-here" class="headerlink" title="推荐教程 click here"></a>推荐教程 <a href="https://book.flutterchina.club/" target="_blank" rel="noopener">click here</a></h1><h1 id="开始"><a href="#开始" class="headerlink" title="开始"></a>开始</h1><h3 id="1-入口文件"><a href="#1-入口文件" class="headerlink" title="1.入口文件"></a>1.入口文件</h3><figure class="highlight dart"><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="keyword">import</span> <span class="string">'package:flutter/material.dart'</span>;</span><br><span class="line"><span class="comment">//不同于javascript，dart需要实现一个main函数，在执行文件到时候运行</span></span><br><span class="line"><span class="keyword">void</span> main() &#123;</span><br><span class="line">  runApp(MyApp()); <span class="comment">//MyApp 实现一个组件类</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-MyApp-实现"><a href="#2-MyApp-实现" class="headerlink" title="2.MyApp 实现"></a>2.MyApp 实现</h3><figure class="highlight dart"><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="class"><span class="keyword">class</span> <span class="title">MyApp</span> <span class="keyword">extends</span> <span class="title">StatelessWidget</span> </span>&#123;</span><br><span class="line">  MyApp(&#123;Key key&#125;) : <span class="keyword">super</span>(key: key);</span><br><span class="line"></span><br><span class="line">  <span class="meta">@override</span> <span class="comment">//class 继承之后  重写父类的方法</span></span><br><span class="line">  Widget build(BuildContext context) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> MaterialApp( <span class="comment">//包含material组件</span></span><br><span class="line">      title: <span class="string">"APP"</span>,</span><br><span class="line">      home: Home(),<span class="comment">//自定义实现到页面内容</span></span><br><span class="line">      theme: ThemeData(primaryColor: CustomTheme.primaryColor),<span class="comment">//主题</span></span><br><span class="line">    );</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="3-实现一个-Widget-组件"><a href="#3-实现一个-Widget-组件" class="headerlink" title="3.实现一个 Widget 组件"></a>3.实现一个 Widget 组件</h3><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Widget Home()=&gt;Center(child:Text(<span class="string">"hello world!"</span>));</span><br></pre></td></tr></table></figure><h3 id="4-路由跳转"><a href="#4-路由跳转" class="headerlink" title="4.路由跳转"></a>4.路由跳转</h3><figure class="highlight dart"><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">Navigator.push(context,</span><br><span class="line">    <span class="keyword">new</span> MaterialPageRoute(</span><br><span class="line">        builder: (BuildContext context) =&gt; newPageWidget()));</span><br></pre></td></tr></table></figure><h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1><h3 id="状态栏高度"><a href="#状态栏高度" class="headerlink" title="状态栏高度"></a>状态栏高度</h3><figure class="highlight dart"><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="comment">// 获取状态栏高度</span></span><br><span class="line"><span class="built_in">double</span> statusBarHeight(BuildContext c) =&gt; MediaQuery.of(c).padding.top;</span><br><span class="line"><span class="comment">// 底部安全区域</span></span><br><span class="line"><span class="built_in">double</span> bottomBarHeight(BuildContext c) =&gt; MediaQuery.of(c).padding.bottom;</span><br></pre></td></tr></table></figure>]]></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;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;git clone &lt;a href=&quot;https://github.com/flutt
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>GO学习项目</title>
    <link href="https://sukeai.netlify.com/2020-01-26/GO%E5%AD%A6%E4%B9%A0%E9%A1%B9%E7%9B%AE.html"/>
    <id>https://sukeai.netlify.com/2020-01-26/GO%E5%AD%A6%E4%B9%A0%E9%A1%B9%E7%9B%AE.html</id>
    <published>2020-01-26T14:33:00.000Z</published>
    <updated>2020-10-19T01:19:56.251Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Go-echo-demo"><a href="#Go-echo-demo" class="headerlink" title="Go-echo-demo"></a>Go-echo-demo</h1><p><a href="https://github.com/Treblex/go-echo-demo" target="_blank" rel="noopener">https://github.com/Treblex/go-echo-demo</a></p><h2 id="go-语言入门"><a href="#go-语言入门" class="headerlink" title="go 语言入门"></a>go 语言入门</h2><p>推荐这个 <a href="https://tour.golang.org/welcome/2" target="_blank" rel="noopener">https://tour.golang.org/welcome/2</a> 还没看完 嘿嘿<br>Go 语言在线练习场，讲解很细</p><h2 id="web-框架"><a href="#web-框架" class="headerlink" title="web 框架"></a>web 框架</h2><p>简单看了一些基础我就来搞这个了，这个项目也是一个 web 实践</p><blockquote><h3 id="echo-官方文档-注意首页有几个很有用的简单实例，但是你按照文档目录是无法返回这一页的-😂-当时找了好久找不到"><a href="#echo-官方文档-注意首页有几个很有用的简单实例，但是你按照文档目录是无法返回这一页的-😂-当时找了好久找不到" class="headerlink" title="echo 官方文档 注意首页有几个很有用的简单实例，但是你按照文档目录是无法返回这一页的 😂 当时找了好久找不到"></a>echo <a href="http://go-echo.org/" target="_blank" rel="noopener">官方文档</a> 注意首页有几个很有用的简单实例，但是你按照文档目录是无法返回这一页的 😂 当时找了好久找不到</h3><p>这个项目就是 据说超快</p></blockquote><blockquote><h3 id="gin-官方文档"><a href="#gin-官方文档" class="headerlink" title="gin 官方文档"></a>gin <a href="https://gin-gonic.com/zh-cn/docs/" target="_blank" rel="noopener">官方文档</a></h3><p>江湖人称：用过都说好，据说开发是可以自动重启 不用手动运行项目 想试试，但是我懒 和上边那个一样快，又一个扩展项目 好像叫 green 可以自动生成文档，不过很久没更新了，有兴趣了解一下这个怎么实现的</p></blockquote><blockquote><h3 id="iris-官方文档"><a href="#iris-官方文档" class="headerlink" title="iris 官方文档"></a>iris <a href="https://iris-go.com/" target="_blank" rel="noopener">官方文档</a></h3><p>大型项目支持</p></blockquote><h2 id="数据库支持"><a href="#数据库支持" class="headerlink" title="数据库支持"></a>数据库支持</h2><p><a href="https://jasperxu.github.io/gorm-zh/crud.html#q" target="_blank" rel="noopener">gorm 中文文档</a> 我看的这个 因为搜索引擎先找到了这个 后来才发现其实不是官方的 这里&gt;&gt;<br><a href="https://gorm.io/" target="_blank" rel="noopener">gorm 官方文档</a></p><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"><span class="string">"github.com/jinzhu/gorm"</span> <span class="comment">//数据库操作框架 支持模型和链式操作 不用写sql了</span></span><br><span class="line">_ <span class="string">"github.com/go-sql-driver/mysql"</span> <span class="comment">//go语言sql驱动</span></span><br><span class="line"></span><br><span class="line">db, err := gorm.Open(<span class="string">"mysql"</span>, config.DataBase)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> &#123;</span><br><span class="line">    <span class="built_in">panic</span>(err)</span><br><span class="line">&#125;</span><br><span class="line">db.LogMode(<span class="literal">true</span>)</span><br><span class="line"><span class="keyword">defer</span> db.Close() <span class="comment">//defer表示函数结束是调用 ，  但是我不想在每个函数都重新打开链接，所以我创建了一个 util包 并暴露了 DB 供全局使用，我在 main.go 的函数结尾出调用了 defer db.Close()，但我并不知道他是否关闭了链接，可以知道的是链接确实只创建了一次，并一直保持</span></span><br></pre></td></tr></table></figure><h1 id="📃-关于这个项目"><a href="#📃-关于这个项目" class="headerlink" title="📃 关于这个项目"></a>📃 关于这个项目</h1><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── Dockerfile <span class="comment">//docker构建 我还在摸索 不过确实运行成功了</span></span><br><span class="line">├── README.md</span><br><span class="line">├── build.linux.sh  <span class="comment">//linux构建文件，我在一段时间后才意识到 编译到不同平台到二进制文件也会有不同，不该是0和1吗 😂</span></span><br><span class="line">├── build.sh         <span class="comment">//mac构建</span></span><br><span class="line">├── build.win.sh    <span class="comment">//win .exe文件</span></span><br><span class="line">├── config</span><br><span class="line">│   └── config.<span class="keyword">go</span>   <span class="comment">//配置文件</span></span><br><span class="line">├── dist            <span class="comment">//编译后到文件</span></span><br><span class="line">│   └── main-linux</span><br><span class="line">├── <span class="keyword">go</span>.mod          <span class="comment">//go模块</span></span><br><span class="line">├── <span class="keyword">go</span>.sum          <span class="comment">//git clone 之后可能需要删除这个文件重新按照mod</span></span><br><span class="line">├── h5              <span class="comment">// 这是一个简单到请求接口到页面，在尝试了一段时间layui写admin页面之后，觉得直接写接口好了，&gt;&gt;&gt; mvc 主要是卡在 模版分离之后 header 和 footer 之类到layout文件 如何请求数据，因为他不对应一个路由，当前找到到方案是模版函数 但是没有运行成功 可能我绑定模版render到方法也有问题, 也尝试了ifarme 不太喜欢，还是后边试一下antd或者自己搞一下vue或者react的后台页面</span></span><br><span class="line">│   ├── api.js</span><br><span class="line">│   ├── index.html</span><br><span class="line">│   ├── main.css</span><br><span class="line">│   └── main.js</span><br><span class="line">├── main.<span class="keyword">go</span>         <span class="comment">//入口文件</span></span><br><span class="line">├── modal           <span class="comment">//模型文件， 数据库查询的方法</span></span><br><span class="line">│   └── user.<span class="keyword">go</span></span><br><span class="line">├── router          <span class="comment">//路由文件</span></span><br><span class="line">│   ├── admin       <span class="comment">//内包含一个类似router.go的入口文件，和其他路由文件</span></span><br><span class="line">│   └── router.<span class="keyword">go</span>   <span class="comment">//暴露一个 Init 方法接收 echo对象, 用于声明当前路面的子文件夹路由对象 或者 路由</span></span><br><span class="line">&gt;&gt;&gt;&gt;&gt;&gt; 例子 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><br><span class="line">    <span class="comment">// 项目首页</span></span><br><span class="line">admin.Init(e, baseURL)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 入口</span></span><br><span class="line">e.GET(baseURL, <span class="function"><span class="keyword">func</span><span class="params">(c echo.Context)</span> <span class="title">error</span></span> &#123;</span><br><span class="line"><span class="keyword">return</span> c.String(http.StatusOK, <span class="string">"hello world！"</span>)</span><br><span class="line">    &#125;)</span><br><span class="line">&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><br><span class="line">├── static  <span class="comment">//资源文件</span></span><br><span class="line">├── template    <span class="comment">//模板文件 弃用mvc之后 只保留了error</span></span><br><span class="line">│   └── error.html</span><br><span class="line">└── util    <span class="comment">//工具包</span></span><br><span class="line">    ├── db.<span class="keyword">go</span>   <span class="comment">// 暴露一个DB对象 用户操作数据库,启动后仅链接一次</span></span><br><span class="line">    ├── <span class="keyword">return</span>.<span class="keyword">go</span>   <span class="comment">//返回的json对象格式 和错误码声明</span></span><br><span class="line">    ├── template.<span class="keyword">go</span> <span class="comment">//声明模版</span></span><br><span class="line">    ├── time.<span class="keyword">go</span> <span class="comment">//时间格式化  以及  链接数据库是自动格式化的一个 结构体</span></span><br><span class="line">    └── util.<span class="keyword">go</span> <span class="comment">//暂无内容--</span></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><figure class="highlight go"><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"><span class="keyword">var</span> timeLayout <span class="keyword">string</span> = <span class="string">"2006年01月02日 15:04:05"</span></span><br><span class="line">t := time.Now()</span><br><span class="line">t.Format(timeLayout)</span><br><span class="line"></span><br><span class="line"><span class="comment">//这里 2006 01 02 15 04 05 必须是固定的才能解析到正确的时间</span></span><br><span class="line"><span class="comment">//我在 util/time.go 内实现了一个简单的方法以使用 y-m-d h:i:s 来格式化时间 主要还是因为懒得记</span></span><br><span class="line"><span class="comment">//  Format 也提供了很多的默认layout，默认layou英文支持做的好一些，中文的显示自定义的layout满足需求</span></span><br></pre></td></tr></table></figure><h3 id="数据库存取时间类型"><a href="#数据库存取时间类型" class="headerlink" title="数据库存取时间类型"></a>数据库存取时间类型</h3><h4 id="gorm-时间类型自定义解析格式"><a href="#gorm-时间类型自定义解析格式" class="headerlink" title="gorm 时间类型自定义解析格式"></a>gorm 时间类型自定义解析格式</h4><figure class="highlight go"><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">// LocalTime 继承time.Time类型</span></span><br><span class="line"><span class="keyword">type</span> LocalTime <span class="keyword">struct</span> &#123;</span><br><span class="line">time.Time</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 自定义的 layout</span></span><br><span class="line"><span class="keyword">var</span> timeLayout <span class="keyword">string</span> = <span class="string">"2006年01月02日 15:04:05"</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// MarshalJSON json格式化时间的方法</span></span><br><span class="line"><span class="comment">// 在网上搜到的方式是格式化为时间戳的  不符合我的需求，这个方法是从 time源代码里找到的,直接修改默认 layout为自定义即可</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(t LocalTime)</span> <span class="title">MarshalJSON</span><span class="params">()</span> <span class="params">([]<span class="keyword">byte</span>, error)</span></span> &#123;</span><br><span class="line"><span class="keyword">if</span> y := t.Year(); y &lt; <span class="number">0</span> || y &gt;= <span class="number">10000</span> &#123;</span><br><span class="line"><span class="comment">// RFC 3339 is clear that years are 4 digits exactly.</span></span><br><span class="line"><span class="comment">// See golang.org/issue/4556#c15 for more discussion.</span></span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span>, errors.New(<span class="string">"Time.MarshalJSON: year outside of range [0,9999]"</span>)</span><br><span class="line">&#125;</span><br><span class="line">b := <span class="built_in">make</span>([]<span class="keyword">byte</span>, <span class="number">0</span>, <span class="built_in">len</span>(timeLayout)+<span class="number">2</span>)</span><br><span class="line">b = <span class="built_in">append</span>(b, <span class="string">'"'</span>)</span><br><span class="line">b = t.AppendFormat(b, timeLayout)</span><br><span class="line">b = <span class="built_in">append</span>(b, <span class="string">'"'</span>)</span><br><span class="line"><span class="keyword">return</span> b, <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//下边两个方法是gorm需要,不需要修改，如果没有使用 gorm则不需要</span></span><br><span class="line"><span class="comment">// Value Value</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(t LocalTime)</span> <span class="title">Value</span><span class="params">()</span> <span class="params">(driver.Value, error)</span></span> &#123;</span><br><span class="line"><span class="keyword">var</span> zeroTime time.Time</span><br><span class="line"><span class="keyword">if</span> t.Time.UnixNano() == zeroTime.UnixNano() &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span>, <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> t.Time, <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Scan Scan</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(t *LocalTime)</span> <span class="title">Scan</span><span class="params">(v <span class="keyword">interface</span>&#123;&#125;)</span> <span class="title">error</span></span> &#123;</span><br><span class="line">value, ok := v.(time.Time)</span><br><span class="line"><span class="keyword">if</span> ok &#123;</span><br><span class="line">*t = LocalTime&#123;Time: value&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> fmt.Errorf(<span class="string">"can not convert %v to timestamp"</span>, v)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="存取时间的时候相差-8-小时"><a href="#存取时间的时候相差-8-小时" class="headerlink" title="存取时间的时候相差 8 小时"></a>存取时间的时候相差 8 小时</h4><figure class="highlight go"><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="comment">//DataBase 数据库配置 username:password@host/database_name?param</span></span><br><span class="line">DataBase <span class="keyword">string</span> = <span class="string">"root:2568597007suke@(localhost:3306)/test?charset=utf8mb4&amp;parseTime=true&amp;loc=Asia%2fShanghai"</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//charset=utf8mb4 数据库编码</span></span><br><span class="line"><span class="comment">//parseTime=true    自动解析时间 time.Time 类型解析显示不正确  z100:h1223 之类的一个字符串</span></span><br><span class="line"><span class="comment">//loc=Asia%2fShanghai  默认亚洲时间，数据库存储 detatime 默认为utc时区 也就是会比国内早8个小时</span></span><br></pre></td></tr></table></figure><h4 id="查询数据时-隐藏某些隐私字段"><a href="#查询数据时-隐藏某些隐私字段" class="headerlink" title="查询数据时 隐藏某些隐私字段"></a>查询数据时 隐藏某些隐私字段</h4><p>gorm:”-“ 在保存数据的时候会忽略 查询是同样显示</p><figure class="highlight go"><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="comment">//暂时的解决方案是声明两个模型，在查询时仅显示必要字段</span></span><br><span class="line"><span class="comment">//由于gorm使用结构名 + s  例如 users articles 默认为约定表名，所以声明另外的模型是需要在查询数据只指定表名</span></span><br><span class="line"><span class="comment">// gorm.Table("users")</span></span><br></pre></td></tr></table></figure><h4 id="！gorm-更新-或者-添加删除字段后-查询影响的数据行数一直为-0，因此无法知道是否更新成功-或者-保存数据成功"><a href="#！gorm-更新-或者-添加删除字段后-查询影响的数据行数一直为-0，因此无法知道是否更新成功-或者-保存数据成功" class="headerlink" title="！gorm 更新 或者 添加删除字段后 查询影响的数据行数一直为 0，因此无法知道是否更新成功 或者 保存数据成功"></a>！gorm 更新 或者 添加删除字段后 查询影响的数据行数一直为 0，因此无法知道是否更新成功 或者 保存数据成功</h4><p>在操作之后重新赋值 db 以获取新的位置 而不是直接使用 db.RowsAffected</p><figure class="highlight go"><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">row := db.Model(&amp;User&#123;ID: id&#125;).Updates(data)</span><br><span class="line">row.RowsAffected</span><br></pre></td></tr></table></figure><h3 id="go-get-安装完包之后不能使用命令后直接执行"><a href="#go-get-安装完包之后不能使用命令后直接执行" class="headerlink" title="go get 安装完包之后不能使用命令后直接执行"></a>go get 安装完包之后不能使用命令后直接执行</h3><p>path 设置错误</p><figure class="highlight sh"><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"><span class="comment"># //go mod需要开启</span></span><br><span class="line"><span class="built_in">export</span> GO111MODULE=on</span><br><span class="line"><span class="comment"># //指定代理</span></span><br><span class="line"><span class="built_in">export</span> GOPROXY=https://goproxy.cn;</span><br><span class="line"><span class="comment"># goroot  go环境所在目录  系统包</span></span><br><span class="line"><span class="built_in">export</span> GOROOT=/usr/<span class="built_in">local</span>/go</span><br><span class="line"><span class="comment"># 安装的package所在目录  自己定义，修改目录之后需要重新安装package</span></span><br><span class="line"><span class="built_in">export</span> GOPATH=~/gowork</span><br><span class="line"><span class="comment"># 将GOPATH/bin 加入全局path之后 自定义安装的package就可以全局运行了 fresh govender</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$GOPATH</span>/bin:<span class="variable">$GOPATH</span>:<span class="variable">$PATH</span></span><br></pre></td></tr></table></figure><h3 id="web-开发时自动重启项目"><a href="#web-开发时自动重启项目" class="headerlink" title="web 开发时自动重启项目"></a>web 开发时自动重启项目</h3><p><a href="https://github.com/gravityblast/fresh" target="_blank" rel="noopener">https://github.com/gravityblast/fresh</a><br>看起来像是检查 ctrl s 的时候重新编译文件并执行，文件没有修改的时候也会触发重启</p><h2 id="⚠️-暂未解决的问题"><a href="#⚠️-暂未解决的问题" class="headerlink" title="⚠️ 暂未解决的问题"></a>⚠️ 暂未解决的问题</h2><h2 id="环境设置"><a href="#环境设置" class="headerlink" title="环境设置"></a>环境设置</h2><figure class="highlight routeros"><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="builtin-name">export</span> <span class="attribute">GO111MODULE</span>=on <span class="attribute">GOPROXY</span>=https://goproxy.cn;</span><br><span class="line"><span class="builtin-name">export</span> <span class="attribute">GOROOT</span>=/usr/local/go</span><br><span class="line"><span class="builtin-name">export</span> <span class="attribute">GOPATH</span>=~/gowork</span><br><span class="line"></span><br><span class="line"><span class="builtin-name">export</span> <span class="attribute">PATH</span>=<span class="variable">$GOPATH</span>/bin:$GOPATH:$PATH</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;Go-echo-demo&quot;&gt;&lt;a href=&quot;#Go-echo-demo&quot; class=&quot;headerlink&quot; title=&quot;Go-echo-demo&quot;&gt;&lt;/a&gt;Go-echo-demo&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Tr
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>在微信登陆遇到重复循环登陆的问题</title>
    <link href="https://sukeai.netlify.com/2020-01-26/%E5%9C%A8%E5%BE%AE%E4%BF%A1%E7%99%BB%E9%99%86%E9%81%87%E5%88%B0%E9%87%8D%E5%A4%8D%E5%BE%AA%E7%8E%AF%E7%99%BB%E9%99%86%E7%9A%84%E9%97%AE%E9%A2%98.html"/>
    <id>https://sukeai.netlify.com/2020-01-26/%E5%9C%A8%E5%BE%AE%E4%BF%A1%E7%99%BB%E9%99%86%E9%81%87%E5%88%B0%E9%87%8D%E5%A4%8D%E5%BE%AA%E7%8E%AF%E7%99%BB%E9%99%86%E7%9A%84%E9%97%AE%E9%A2%98.html</id>
    <published>2020-01-26T01:28:57.000Z</published>
    <updated>2020-10-19T01:19:56.253Z</updated>
    
    <content type="html"><![CDATA[<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>最近遇到一个挺奇怪的问题，在微信使用公众号登陆，走完登陆流程，拿到token，返回上一页继续请求接口，仍然木有权限，需要重新登陆<br>也有表现为直接注册失败</p><h2 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h2><p>问题是后端解决的，因为数据库格式的问题，存带有emoji的微信用户名时，数据库报了错，修改字段格式或者数据库编码解决</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;简介&quot;&gt;&lt;a href=&quot;#简介&quot; class=&quot;headerlink&quot; title=&quot;简介&quot;&gt;&lt;/a&gt;简介&lt;/h2&gt;&lt;p&gt;最近遇到一个挺奇怪的问题，在微信使用公众号登陆，走完登陆流程，拿到token，返回上一页继续请求接口，仍然木有权限，需要重新登陆&lt;br&gt;也有
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>UniApp Push检测 👂</title>
    <link href="https://sukeai.netlify.com/2019-12-03/Push%E6%A3%80%E6%B5%8B.html"/>
    <id>https://sukeai.netlify.com/2019-12-03/Push%E6%A3%80%E6%B5%8B.html</id>
    <published>2019-12-03T13:56:10.000Z</published>
    <updated>2020-10-19T01:19:56.252Z</updated>
    
    <content type="html"><![CDATA[<h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><figure class="highlight javascript"><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"><span class="keyword">import</span> push <span class="keyword">from</span> <span class="string">'./push</span></span><br><span class="line"><span class="string">let checkPush = new push()</span></span><br></pre></td></tr></table></figure><h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><p>这里class用处不大，只是觉得看起来很舒服，拆分模块也方便后续扩展</p><figure class="highlight javascript"><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><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="class"><span class="keyword">class</span> <span class="title">push</span></span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 初始化</span></span><br><span class="line"><span class="keyword">constructor</span>()&#123;</span><br><span class="line"><span class="keyword">this</span>.init()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">init()&#123;</span><br><span class="line"><span class="comment">// 开启推送</span></span><br><span class="line">uni.subscribePush(&#123;</span><br><span class="line">provider: <span class="string">"unipush"</span>,</span><br><span class="line">success: <span class="function"><span class="keyword">function</span>(<span class="params">res</span>) </span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"success:"</span> + <span class="built_in">JSON</span>.stringify(res));</span><br><span class="line">&#125;</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">this</span>.onPush()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">onPush()&#123;</span><br><span class="line"><span class="comment">// 分客户端不同方案监听</span></span><br><span class="line"><span class="keyword">let</span> osname = plus.os.name</span><br><span class="line"><span class="built_in">console</span>.log(osname,<span class="string">'unipush'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (osname == <span class="string">'Android'</span>) &#123;</span><br><span class="line">uni.onPush(&#123;</span><br><span class="line">provider: <span class="string">"unipush"</span>,</span><br><span class="line">success: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"监听透传成功"</span>);</span><br><span class="line">&#125;,</span><br><span class="line">callback: <span class="function"><span class="keyword">function</span>(<span class="params">data</span>) </span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"接收到透传数据："</span> + <span class="built_in">JSON</span>.stringify(data));</span><br><span class="line">plus.push.createMessage(data.data, &#123;&#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="comment">// 监听在线消息事件</span></span><br><span class="line"><span class="keyword">if</span> (osname == <span class="string">'iOS'</span>) &#123;</span><br><span class="line">plus.push.addEventListener(<span class="string">'receive'</span>, <span class="function"><span class="keyword">function</span>(<span class="params">msg</span>) </span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(msg)</span><br><span class="line"> plus.push.createMessage(msg.content, <span class="string">"LocalMSG"</span>, &#123;</span><br><span class="line">cover: <span class="literal">false</span></span><br><span class="line"> &#125;);</span><br><span class="line">setTimeout(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line"><span class="comment">// plus.push.clear();</span></span><br><span class="line">&#125;, <span class="number">3000</span>)</span><br><span class="line">&#125;, <span class="literal">false</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">this</span>.onMessage()</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 点击消息处理</span></span><br><span class="line">onMessage()&#123;</span><br><span class="line">plus.push.addEventListener(</span><br><span class="line"><span class="string">"click"</span>,</span><br><span class="line"><span class="function"><span class="keyword">function</span>(<span class="params">data</span>) </span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(data);</span><br><span class="line">&#125;,</span><br><span class="line"><span class="literal">false</span></span><br><span class="line">);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;使用&quot;&gt;&lt;a href=&quot;#使用&quot; class=&quot;headerlink&quot; title=&quot;使用&quot;&gt;&lt;/a&gt;使用&lt;/h2&gt;&lt;figure class=&quot;highlight javascript&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>🚀 UniApp热更新检测🔥🔥🔥</title>
    <link href="https://sukeai.netlify.com/2019-12-03/UniApp%E7%83%AD%E6%9B%B4%E6%96%B0%E6%A3%80%E6%B5%8B.html"/>
    <id>https://sukeai.netlify.com/2019-12-03/UniApp%E7%83%AD%E6%9B%B4%E6%96%B0%E6%A3%80%E6%B5%8B.html</id>
    <published>2019-12-03T13:55:37.000Z</published>
    <updated>2020-10-19T01:19:56.252Z</updated>
    
    <content type="html"><![CDATA[<h1 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h1><figure class="highlight javascript"><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></pre></td><td class="code"><pre><span class="line">   <span class="comment">//入口文件</span></span><br><span class="line">   <span class="comment">// 检查更新</span></span><br><span class="line"><span class="keyword">let</span> updateCheck = <span class="comment">//new update(this.api.update,true,'1.0.0')</span></span><br><span class="line"></span><br><span class="line">   <span class="comment">// 模板中</span></span><br><span class="line">   <span class="keyword">import</span> update <span class="keyword">from</span> <span class="string">'@/util/update.js'</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span><br><span class="line">data() &#123;</span><br><span class="line"><span class="keyword">return</span> &#123;</span><br><span class="line">updateCheck:<span class="comment">//new update(this.api.update),</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;,</span><br><span class="line">       ...</span><br><span class="line"></span><br><span class="line">       updateCheck.status <span class="comment">//更新状态</span></span><br><span class="line"></span><br><span class="line">       updateCheck.version <span class="comment">//当前资源包版本</span></span><br><span class="line"></span><br><span class="line">       updateCheck.doUpdate() <span class="comment">//更新方法</span></span><br></pre></td></tr></table></figure><h1 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h1><p>接口和字段都需要对应修改</p><figure class="highlight javascript"><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><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br></pre></td><td class="code"><pre><span class="line">    <span class="keyword">export</span> <span class="keyword">default</span> <span class="class"><span class="keyword">class</span> <span class="title">update</span> </span>&#123;</span><br><span class="line"><span class="comment">// #ifdef APP-PLUS</span></span><br><span class="line"><span class="comment">// 查询更新接口</span></span><br><span class="line">api = <span class="literal">null</span></span><br><span class="line"><span class="comment">// 当前版本号</span></span><br><span class="line">version = <span class="string">'1.0.0'</span></span><br><span class="line"><span class="comment">// 更新包状态</span></span><br><span class="line">status = <span class="string">''</span></span><br><span class="line">updateInfo = &#123;&#125; <span class="comment">//远程返回的更新信息</span></span><br><span class="line">autoInstall=<span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 初始化</span></span><br><span class="line"><span class="keyword">constructor</span>(api,autoInstall=false,choooseVersion='1.0.40') &#123;</span><br><span class="line"><span class="keyword">this</span>.api = api</span><br><span class="line"><span class="keyword">this</span>.autoInstall=autoInstall</span><br><span class="line"><span class="keyword">this</span>.choooseVersion = choooseVersion</span><br><span class="line"><span class="keyword">this</span>.init()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> init() &#123;</span><br><span class="line"><span class="keyword">this</span>.status = <span class="keyword">await</span> <span class="keyword">this</span>.checkVersion()</span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">this</span>.autoInstall)&#123;</span><br><span class="line"><span class="keyword">this</span>.doUpdate(<span class="literal">true</span>)</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 获取版本号</span></span><br><span class="line">getVersion() &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function">(<span class="params">resolve, reject</span>) =&gt;</span> &#123;</span><br><span class="line">plus.runtime.getProperty(plus.runtime.appid, widgetInfo =&gt; &#123;</span><br><span class="line"><span class="keyword">if</span> (widgetInfo) &#123;</span><br><span class="line"><span class="keyword">if</span>(widgetInfo.version == <span class="keyword">this</span>.choooseVersion)&#123;</span><br><span class="line">uni.setStorageSync(<span class="string">'chooseVersion'</span>,<span class="literal">true</span>)</span><br><span class="line">&#125;</span><br><span class="line">resolve(widgetInfo.version)</span><br><span class="line">&#125;</span><br><span class="line">reject(widgetInfo)</span><br><span class="line">&#125;)</span><br><span class="line">&#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 查看云端接口</span></span><br><span class="line"><span class="keyword">async</span> checkVersion() &#123;</span><br><span class="line"><span class="keyword">let</span> version = <span class="keyword">await</span> <span class="keyword">this</span>.getVersion()</span><br><span class="line"><span class="keyword">this</span>.version = version</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function">(<span class="params">resolve, reject</span>) =&gt;</span> &#123;</span><br><span class="line"><span class="keyword">this</span>.api().then(<span class="function"><span class="params">res</span> =&gt;</span> &#123;</span><br><span class="line"><span class="keyword">if</span> (res) &#123;</span><br><span class="line"><span class="keyword">this</span>.updateInfo = res</span><br><span class="line"><span class="built_in">console</span>.log(res)</span><br><span class="line"><span class="keyword">let</span> &#123;</span><br><span class="line">version: versionOl,</span><br><span class="line">update_size</span><br><span class="line">&#125; = res</span><br><span class="line"><span class="keyword">if</span> (versionOl == version) &#123;</span><br><span class="line">resolve(<span class="string">''</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">let</span> versionArr = version.split(<span class="string">'.'</span>).map(<span class="function"><span class="params">x</span>=&gt;</span><span class="built_in">Number</span>(x))</span><br><span class="line"><span class="keyword">let</span> versionOlArr = versionOl.split(<span class="string">'.'</span>).map(<span class="function"><span class="params">x</span>=&gt;</span><span class="built_in">Number</span>(x))</span><br><span class="line"><span class="built_in">console</span>.log(versionOlArr, versionArr)</span><br><span class="line"><span class="keyword">if</span> (versionArr &amp;&amp; versionOlArr) &#123;</span><br><span class="line"><span class="keyword">if</span> (versionOlArr[<span class="number">0</span>] &gt; versionArr[<span class="number">0</span>] &amp;&amp; update_size==<span class="number">2</span>) &#123;</span><br><span class="line">resolve(<span class="string">'版本更新'</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (versionOlArr[<span class="number">0</span>] == versionArr[<span class="number">0</span>]) &#123;</span><br><span class="line"><span class="keyword">if</span> (versionOlArr[<span class="number">1</span>] &gt; versionArr[<span class="number">1</span>]) &#123;</span><br><span class="line">resolve(<span class="string">'修复更新'</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (versionOlArr[<span class="number">0</span>] == versionArr[<span class="number">0</span>]) &#123;</span><br><span class="line"><span class="keyword">if</span> (versionOlArr[<span class="number">2</span>] &gt; versionArr[<span class="number">2</span>]) &#123;</span><br><span class="line">resolve(<span class="string">'修复更新'</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">reject(<span class="string">'获取版本号失败'</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><br><span class="line"><span class="comment">// 整包更新</span></span><br><span class="line">doFullUpdate() &#123;</span><br><span class="line"><span class="keyword">let</span> url = <span class="keyword">this</span>.updateInfo.download_url</span><br><span class="line">plus.runtime.openURL(url);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 热更新</span></span><br><span class="line">doUpdate(autoInstall) &#123;</span><br><span class="line"><span class="keyword">let</span> that = <span class="keyword">this</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">this</span>.status == <span class="string">'版本更新'</span>)&#123;</span><br><span class="line"><span class="keyword">this</span>.doFullUpdate()</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">this</span>.status == <span class="string">'修复更新'</span>)&#123;</span><br><span class="line"><span class="keyword">if</span>(autoInstall)&#123;</span><br><span class="line">uni.showModal(&#123;</span><br><span class="line">title:<span class="string">"更新提示"</span>,</span><br><span class="line">content:<span class="keyword">this</span>.updateInfo.version_desc +<span class="string">'\n更新版本号：'</span> +<span class="keyword">this</span>.updateInfo.version,</span><br><span class="line">success(res)&#123;</span><br><span class="line"><span class="keyword">if</span>(res.confirm)&#123;</span><br><span class="line">that.install()</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 class="keyword">else</span>&#123;</span><br><span class="line"><span class="keyword">this</span>.install()</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//下载热更新包 重启更新</span></span><br><span class="line">install()&#123;</span><br><span class="line">uni.showLoading(&#123;</span><br><span class="line">title:<span class="string">"下载更新中"</span>,</span><br><span class="line">icon:<span class="string">"none"</span>,</span><br><span class="line">mask:<span class="literal">true</span></span><br><span class="line">&#125;)</span><br><span class="line">uni.downloadFile(&#123;</span><br><span class="line">url: <span class="keyword">this</span>.updateInfo.update_file,</span><br><span class="line">success: <span class="function"><span class="params">downloadResult</span> =&gt;</span> &#123;</span><br><span class="line">uni.hideLoading();</span><br><span class="line"><span class="built_in">console</span>.log(downloadResult);</span><br><span class="line">uni.showLoading(&#123;</span><br><span class="line">title: <span class="string">"正在安装..."</span>,</span><br><span class="line">icon: <span class="string">"none"</span>,</span><br><span class="line">mask:<span class="literal">true</span></span><br><span class="line">&#125;);</span><br><span class="line"><span class="keyword">if</span> (downloadResult.statusCode === <span class="number">200</span>) &#123;</span><br><span class="line">plus.runtime.install(</span><br><span class="line">downloadResult.tempFilePath, &#123;&#125;,</span><br><span class="line"><span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">uni.hideLoading();</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"install success..."</span>);</span><br><span class="line">uni.showModal(&#123;</span><br><span class="line">title: <span class="string">"提示"</span>,</span><br><span class="line">content: <span class="string">"更新已安装，是否立即重启？"</span>,</span><br><span class="line">success(res) &#123;</span><br><span class="line"><span class="keyword">if</span> (res.confirm) &#123;</span><br><span class="line">plus.runtime.restart();</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="function"><span class="keyword">function</span> (<span class="params">e</span>) </span>&#123;</span><br><span class="line">uni.hideLoading();</span><br><span class="line"><span class="built_in">console</span>.error(<span class="string">"install fail..."</span>, e);</span><br><span class="line">&#125;</span><br><span class="line">);</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="comment">// #endif</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></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 javascript&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;
      
    
    </summary>
    
    
    
      <category term="javascript uniapp" scheme="https://sukeai.netlify.com/tags/javascript-uniapp/"/>
    
  </entry>
  
  <entry>
    <title>uniapp快速开发常用工具「1」🔧 📦</title>
    <link href="https://sukeai.netlify.com/2019-11-28/uniapp%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%E3%80%8C1%E3%80%8D.html"/>
    <id>https://sukeai.netlify.com/2019-11-28/uniapp%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%E3%80%8C1%E3%80%8D.html</id>
    <published>2019-11-28T11:50:00.000Z</published>
    <updated>2020-10-19T01:19:56.253Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>自己在项目中总结的一些工具，总会有不足，欢迎指正</p></blockquote><h1 id="request-已发布Dcloud插件"><a href="#request-已发布Dcloud插件" class="headerlink" title="request 已发布Dcloud插件"></a>request 已发布Dcloud插件</h1><p><a href="https://ext.dcloud.net.cn/plugin?id=714" target="_blank" rel="noopener">request easy use 通用网络请求 Dcloud插件</a><br>网络请求整理，常用的一些请求方法，接口整合</p><p>待修复：console.log() 打印请求配置和返回信息的时候使用了 emoji和%c style样式，导致android 5.1及以下的部分机型白屏，删除掉就行了<br>做网页项目看着还挺舒服的 没忍心删 以后修复吧</p><h1 id="push检测"><a href="#push检测" class="headerlink" title="push检测"></a>push检测</h1><p><a href="/2019-12-03/Push检测.html">/2019-12-03/Push检测.html</a></p><h1 id="热更新检测"><a href="#热更新检测" class="headerlink" title="热更新检测"></a>热更新检测</h1><p><a href="/2019-12-03/UniApp热更新检测.html">/2019-12-03/UniApp热更新检测.html</a></p><h1 id="通用自定义弹窗"><a href="#通用自定义弹窗" class="headerlink" title="通用自定义弹窗"></a>通用自定义弹窗</h1><p><a href="https://ext.dcloud.net.cn/plugin?id=507" target="_blank" rel="noopener">常见对popup组件 对话框 loading等（js调用https://ext.dcloud.net.cn/plugin?id=507</a><br>自定义的对话框 loading提示，可以方便的扩展其他通用弹层</p><!-- # 其他的没啥好写的了  晚点整理下  发插件吧 -->]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;自己在项目中总结的一些工具，总会有不足，欢迎指正&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;request-已发布Dcloud插件&quot;&gt;&lt;a href=&quot;#request-已发布Dcloud插件&quot; class=&quot;headerlink&quot; ti
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>express试水（1）「大淘客api」😎</title>
    <link href="https://sukeai.netlify.com/2019-11-27/express%E8%AF%95%E6%B0%B4%E3%80%8C1%E3%80%8D.html"/>
    <id>https://sukeai.netlify.com/2019-11-27/express%E8%AF%95%E6%B0%B4%E3%80%8C1%E3%80%8D.html</id>
    <published>2019-11-27T12:00:00.000Z</published>
    <updated>2020-10-19T01:19:56.252Z</updated>
    
    <content type="html"><![CDATA[<h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><blockquote><p>npm init</p></blockquote><blockquote><p>npm install express –save</p></blockquote><h2 id="快速生成项目"><a href="#快速生成项目" class="headerlink" title="快速生成项目"></a>快速生成项目</h2><blockquote><p>npm install -g express-generator</p></blockquote><blockquote><p>express newApp</p></blockquote><h1 id="基础目录"><a href="#基础目录" class="headerlink" title="基础目录"></a>基础目录</h1><p><img src="https://tva1.sinaimg.cn/large/006y8mN6gy1g9eofwkq2mj30950dsdgq.jpg" alt></p><h3 id="bin-www"><a href="#bin-www" class="headerlink" title="bin/www"></a><code>bin/www</code></h3><p>www配置文件，某些插件会把log文件写在这里</p><h3 id="public"><a href="#public" class="headerlink" title="public"></a><code>public</code></h3><p>静态资源文件，需要在入口文件挂载才可以访问</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">//static是一个虚拟目录 可以直接用 root目录</span><br><span class="line">app.use(&apos;/static&apos;,express.static(path.join(__dirname, &apos;public&apos;)));</span><br></pre></td></tr></table></figure><h3 id="routes"><a href="#routes" class="headerlink" title="routes"></a><code>routes</code></h3><p>路由文件</p><h3 id="views"><a href="#views" class="headerlink" title="views"></a><code>views</code></h3><p>模板文件，可自定义程度很高 还没有详细了解过，暂时倾向于前后端分离，只写接口在这里</p><h3 id="app-js"><a href="#app-js" class="headerlink" title="app.js"></a><code>app.js</code></h3><p>入口文件，大部分的配置都可以在这里完成<br>使用插件  cookie jsonparse 这些都需要引用插件实现，模板项目中已经生成了常用的插件<br>自定义模板<br>定义路由</p><h1 id="Curl接第三方接口"><a href="#Curl接第三方接口" class="headerlink" title="Curl接第三方接口"></a>Curl接第三方接口</h1><blockquote><p>这里使用大淘客的api做的尝试，没有具体项目逻辑想不到应该做什么，另外数据库也还没尝试</p></blockquote><h2 id="demo"><a href="#demo" class="headerlink" title="demo"></a>demo</h2><p><a href="https://github.com/Treblex/dataoke-api/blob/master/server/util/CommodityFactory.js" target="_blank" rel="noopener">https://github.com/Treblex/dataoke-api/blob/master/server/util/CommodityFactory.js</a></p><blockquote><p>新建一个文件夹放自己的工具类就可以，对文件夹结构没有强制对要求,对应的调用方法在 router/api.js</p></blockquote><h2 id="Request"><a href="#Request" class="headerlink" title="Request"></a>Request</h2><p>直接调用request模块就可以，使用方法也非常的简单，符合前端的习惯</p><figure class="highlight javascript"><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"><span class="keyword">const</span> request = <span class="built_in">require</span>(<span class="string">'request'</span>);</span><br><span class="line">request(&#123;data&#125;,callback=<span class="function">(<span class="params">err,res,body</span>)=&gt;</span>&#123;&#125;)</span><br></pre></td></tr></table></figure><h2 id="验签"><a href="#验签" class="headerlink" title="验签"></a>验签</h2><p>在大淘客的demo中，引用了corypt md5进行加密，这里需要注意不要在引用文件后就立即<code>createHash('md5')</code>，因为每个实例只能进行一次加密，在需要的地方<code>createHash('md5')</code>就可以了</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crypto.createHash(&apos;md5&apos;)</span><br></pre></td></tr></table></figure><h2 id="调用"><a href="#调用" class="headerlink" title="调用"></a>调用</h2><p><a href="https://github.com/Treblex/dataoke-api/blob/master/server/routes/api.js" target="_blank" rel="noopener">https://github.com/Treblex/dataoke-api/blob/master/server/routes/api.js</a></p><figure class="highlight javascript"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> express = <span class="built_in">require</span>(<span class="string">'express'</span>);</span><br><span class="line"><span class="keyword">var</span> router = express.Router();</span><br><span class="line"><span class="keyword">var</span> factory = <span class="built_in">require</span>(<span class="string">'../util/CommodityFactory'</span>)</span><br><span class="line"><span class="comment">// 商品工厂对象</span></span><br><span class="line"><span class="keyword">let</span> CommodityFactory = <span class="keyword">new</span> factory(&#123;</span><br><span class="line">  appSecret: <span class="string">'17eda35413998548b3fdebd31e6d2c51'</span>,</span><br><span class="line">  appKey: <span class="string">'5dc6fcef48989'</span></span><br><span class="line">&#125;)</span><br><span class="line"><span class="comment">// 临时写的</span></span><br><span class="line"><span class="keyword">const</span> errCode = <span class="function">(<span class="params">title</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> &#123;</span><br><span class="line">    time: <span class="keyword">new</span> <span class="built_in">Date</span>() * <span class="number">1</span>,</span><br><span class="line">    code: <span class="number">-1</span>,</span><br><span class="line">    msg: title,</span><br><span class="line">    data: &#123;&#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 品牌</span></span><br><span class="line">router.get(<span class="string">'/get-brand-list'</span>, <span class="keyword">async</span> <span class="function"><span class="keyword">function</span> (<span class="params">req, res, next</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> &#123;</span><br><span class="line">    pageId,</span><br><span class="line">    pageSize = <span class="number">10</span></span><br><span class="line">  &#125; = req.query</span><br><span class="line"><span class="comment">//   req.query 请求的参数,</span></span><br><span class="line"><span class="comment">//   如果需要支持类似thinkphp的静态url   url地址可以写成  '/detail/:id'</span></span><br><span class="line"><span class="comment">//   取值使用 req.params['id'],如果有正则，正则的部分为 req.params[index]</span></span><br><span class="line">  <span class="keyword">if</span> (!pageId) &#123;</span><br><span class="line">    res.send(errCode(<span class="string">"pageId不可空"</span>))</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">let</span> body = <span class="keyword">await</span> CommodityFactory.getBarndList(&#123;</span><br><span class="line">    pageId,</span><br><span class="line">    pageSize</span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment">//   返回页面显示的内容，在此之前可以设置返回的header 等一些常用内容</span></span><br><span class="line">  res.send(body)</span><br><span class="line"><span class="comment">//   res.render('index', &#123; title: 'Express' ,中文:"打火机卡上打哈电话接啊活动空间啊"&#125;);</span></span><br><span class="line"><span class="comment">// 渲染到模板的写法，第一个参数模板名字，第二个为渲染到模板的变量</span></span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h1 id="中间件开发"><a href="#中间件开发" class="headerlink" title="中间件开发"></a>中间件开发</h1><p><a href="http://www.expressjs.com.cn/guide/writing-middleware.html" target="_blank" rel="noopener">官网文档&gt;&gt;</a></p><p>我的理解是中间件在php中类似于一个base控制器，</p><figure class="highlight php"><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"><span class="class"><span class="keyword">class</span> <span class="title">loginBase</span></span>&#123;</span><br><span class="line">    <span class="comment">// 检查登录，跳转页面</span></span><br><span class="line">    <span class="keyword">if</span>(isLogin)&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// 301 login.html</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">home</span> <span class="keyword">extends</span> <span class="title">loginBase</span></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> home</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://tva1.sinaimg.cn/large/006y8mN6gy1g9eotnxbkaj30tk0iswkf.jpg" alt><br>像文档中介绍的，其实我们定义的路由也是中间件<br>我能想到的常用的业务场景就是像上边的 登录检测，用户权限这些</p><figure class="highlight javascript"><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">app.use(<span class="string">'/api'</span>,(res,req,next)=&gt;&#123;</span><br><span class="line">  <span class="built_in">console</span>.log(<span class="string">'==err==||AppBase 登录检测或一些其他的内容'</span>);</span><br><span class="line">  <span class="keyword">let</span> islogin = <span class="literal">false</span></span><br><span class="line">  <span class="keyword">if</span>(!islogin)&#123;</span><br><span class="line">    req.send(<span class="string">'err 未登录什么的'</span>),<span class="comment">//如果不执行下一步业务逻辑，我们就必须结束请求，而不能直接return，否则页面会一直处于加载中，直到请求超时</span></span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  next();<span class="comment">//执行下一步  api的路由文件</span></span><br><span class="line">&#125;)</span><br><span class="line">app.use(<span class="string">'/api'</span>, apiRouter);<span class="comment">//自定义路由  业务逻辑</span></span><br></pre></td></tr></table></figure><h1 id="End"><a href="#End" class="headerlink" title="End"></a>End</h1><p>还没有部署，客户端没写，接口都对了，下面是github仓库<br><a href="https://github.com/Treblex/dataoke-api" target="_blank" rel="noopener">https://github.com/Treblex/dataoke-api</a></p><p>其实遇到一个问题没有解决，request大淘客接口的时候又一个 version参数，这个参数有的接口是1.0.0 有的是1.0.1，而且有过期验证，过期的版本无法使用，对于怎么更新接口版本和过期通知没有太好解决方法，现在version是在factory的每个请求里边写的默认参数</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;blockquote&gt;
&lt;p&gt;npm init&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;npm install ex
      
    
    </summary>
    
    
    
      <category term="express" scheme="https://sukeai.netlify.com/tags/express/"/>
    
      <category term="javascript" scheme="https://sukeai.netlify.com/tags/javascript/"/>
    
  </entry>
  
  <entry>
    <title>分割一个长数组至 n 个 len 长度的小数组</title>
    <link href="https://sukeai.netlify.com/2019-08-23/%E5%88%86%E5%89%B2%E4%B8%80%E4%B8%AA%E9%95%BF%E6%95%B0%E7%BB%84%E8%87%B3-n-%E4%B8%AA-len-%E9%95%BF%E5%BA%A6%E7%9A%84%E5%B0%8F%E6%95%B0%E7%BB%84.html"/>
    <id>https://sukeai.netlify.com/2019-08-23/%E5%88%86%E5%89%B2%E4%B8%80%E4%B8%AA%E9%95%BF%E6%95%B0%E7%BB%84%E8%87%B3-n-%E4%B8%AA-len-%E9%95%BF%E5%BA%A6%E7%9A%84%E5%B0%8F%E6%95%B0%E7%BB%84.html</id>
    <published>2019-08-23T14:33:19.000Z</published>
    <updated>2020-10-19T01:19:56.253Z</updated>
    
    <content type="html"><![CDATA[<h2 id="场景"><a href="#场景" class="headerlink" title="场景"></a>场景</h2><blockquote><p>  拆分一个长列表<code>[1,2,3,...n]</code> 至 <code>[[1,2,3],[1,2,3],[1,2,3]...]</code> 配合套嵌循环，可以简单实现很多有趣的布局</p></blockquote><h2 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h2><blockquote><p>使用<code>flex</code>实现<code>Grid布局</code>,(这里flex好像作用不大哈哈 <code>float</code>也行)</p></blockquote><h2 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h2><table><thead><tr><th align="center">序号</th><th align="left">内容</th></tr></thead><tbody><tr><td align="center">1</td><td align="left">拆分列表之后，之际写了两个循环，例:<code>[[1,2,3],[1,2,3],[1,2,3]...]</code></td></tr><tr><td align="center">2</td><td align="left">第一级的item为<code>[1,2,3]</code>，也就是一行的内容</td></tr><tr><td align="center">3</td><td align="left">第二级就是单个icon的内容</td></tr></tbody></table><p><img src="https://i.loli.net/2019/08/23/buU3AjRgi9Xlzre.png" alt></p><blockquote><p>到这里html 结构就完成,html结构比较分明,利用css <code>nth-child</code>也可以实现一些比较有趣的效果，例如：<code>nth-child(odd)</code> 和  <code>nth-child(even)</code> 搭配实现棋盘样式，或者上图这种九宫格样式的内边框</p></blockquote><h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><figure class="highlight javascript"><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="comment">/**</span></span><br><span class="line"><span class="comment"> * // 分割一个长数组至 n 个 len 长度的小数组</span></span><br><span class="line"><span class="comment"> * @param &#123;Array&#125; arr 需要转换的数组</span></span><br><span class="line"><span class="comment"> * @param &#123;Number&#125; len 切割的长度</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">const</span> split_array = <span class="function">(<span class="params">arr, len</span>) =&gt;</span> &#123;</span><br><span class="line"><span class="keyword">var</span> a_len = arr.length;</span><br><span class="line"><span class="keyword">var</span> result = [];</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; a_len; i += len) &#123;</span><br><span class="line">result.push(arr.slice(i, i + len));</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;场景&quot;&gt;&lt;a href=&quot;#场景&quot; class=&quot;headerlink&quot; title=&quot;场景&quot;&gt;&lt;/a&gt;场景&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;  拆分一个长列表&lt;code&gt;[1,2,3,...n]&lt;/code&gt; 至 &lt;code&gt;[[1,2,3],[1,2,
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>javascript时间戳转指定格式 ⌚️</title>
    <link href="https://sukeai.netlify.com/2019-08-23/javascript%E6%97%B6%E9%97%B4%E6%88%B3%E8%BD%AC%E6%8C%87%E5%AE%9A%E6%A0%BC%E5%BC%8F.html"/>
    <id>https://sukeai.netlify.com/2019-08-23/javascript%E6%97%B6%E9%97%B4%E6%88%B3%E8%BD%AC%E6%8C%87%E5%AE%9A%E6%A0%BC%E5%BC%8F.html</id>
    <published>2019-08-22T17:43:23.000Z</published>
    <updated>2020-10-19T01:19:56.252Z</updated>
    
    <content type="html"><![CDATA[<h2 id="场景"><a href="#场景" class="headerlink" title="场景"></a>场景</h2><blockquote><p>Api直接返回数据库表的curd小伙伴</p></blockquote><h2 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h2><table><thead><tr><th align="center">序号</th><th align="left">简介</th></tr></thead><tbody><tr><td align="center">1</td><td align="left">new 一个时间对象 返回 年月日 时分秒（按需补0</td></tr><tr><td align="center">2</td><td align="left">传入一个类似 Y-m-d H:i:s 格式的字符串 不区分大小写</td></tr><tr><td align="center">3</td><td align="left">使用正则替换内容</td></tr></tbody></table><h2 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h2><p><img src="https://i.loli.net/2019/08/22/dVM6fRGBKlSbIro.png" alt></p><h2 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h2><figure class="highlight javascript"><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><span class="line"><span class="comment">//返回时间对象</span></span><br><span class="line"><span class="keyword">const</span> getDate = <span class="function">(<span class="params">time</span>) =&gt;</span> &#123;</span><br><span class="line"><span class="keyword">let</span> date = <span class="keyword">new</span> <span class="built_in">Date</span>(time)</span><br><span class="line"><span class="keyword">let</span> year = date.getFullYear()</span><br><span class="line"><span class="keyword">let</span> month = fix0(date.getMonth() + <span class="number">1</span>)</span><br><span class="line"><span class="keyword">let</span> day = fix0(date.getDate())</span><br><span class="line"><span class="keyword">let</span> h = fix0(date.getHours())</span><br><span class="line"><span class="keyword">let</span> minutes = fix0(date.getMinutes())</span><br><span class="line"><span class="keyword">let</span> seconds = fix0(date.getSeconds())</span><br><span class="line"><span class="keyword">return</span> &#123;</span><br><span class="line">year,</span><br><span class="line">month,</span><br><span class="line">day,</span><br><span class="line">h,</span><br><span class="line">minutes,</span><br><span class="line">seconds</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 时间格式化</span></span><br><span class="line"><span class="comment"> * @param &#123;*&#125; time  10位时间戳</span></span><br><span class="line"><span class="comment"> * @param &#123;*&#125; str   制定到时间格式 y-m-d H:i:s 不区分大小写</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">const</span> timeformat = <span class="function">(<span class="params">time, str = <span class="string">'y-m-d H:i:S'</span></span>) =&gt;</span> &#123;</span><br><span class="line"><span class="keyword">let</span> obj = getDate(time * <span class="number">1</span>)</span><br><span class="line"><span class="keyword">if</span> (!obj) &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">let</span> result = str.replace(<span class="regexp">/([yY])/</span>, <span class="string">`<span class="subst">$&#123;obj.year&#125;</span>`</span>)</span><br><span class="line">.replace(<span class="regexp">/([mM])/</span>, <span class="string">`<span class="subst">$&#123;obj.month&#125;</span>`</span>)</span><br><span class="line">.replace(<span class="regexp">/([dD])/</span>, <span class="string">`<span class="subst">$&#123;obj.day&#125;</span>`</span>)</span><br><span class="line">.replace(<span class="regexp">/([hH])/</span>, <span class="string">`<span class="subst">$&#123;obj.h&#125;</span>`</span>)</span><br><span class="line">.replace(<span class="regexp">/([iI])/</span>, <span class="string">`<span class="subst">$&#123;obj.minutes&#125;</span>`</span>)</span><br><span class="line">.replace(<span class="regexp">/([sS])/</span>, <span class="string">`<span class="subst">$&#123;obj.seconds&#125;</span>`</span>)</span><br><span class="line"><span class="keyword">return</span> result</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 十以内数字补零</span></span><br><span class="line"><span class="keyword">const</span> fix0 = <span class="function">(<span class="params">num</span>) =&gt;</span> &#123;</span><br><span class="line"><span class="keyword">return</span> num &lt; <span class="number">10</span> ? <span class="built_in">String</span>(<span class="string">'0'</span> + num) : <span class="built_in">String</span>(num)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;场景&quot;&gt;&lt;a href=&quot;#场景&quot; class=&quot;headerlink&quot; title=&quot;场景&quot;&gt;&lt;/a&gt;场景&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Api直接返回数据库表的curd小伙伴&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;思路&quot;&gt;&lt;a href
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>常用javascript方法整理之数字千分位格式化</title>
    <link href="https://sukeai.netlify.com/2019-08-21/%E5%B8%B8%E7%94%A8javascript%E6%96%B9%E6%B3%95%E6%95%B4%E7%90%86%E4%B9%8B%E6%95%B0%E5%AD%97%E5%8D%83%E5%88%86%E4%BD%8D%E6%A0%BC%E5%BC%8F%E5%8C%96.html"/>
    <id>https://sukeai.netlify.com/2019-08-21/%E5%B8%B8%E7%94%A8javascript%E6%96%B9%E6%B3%95%E6%95%B4%E7%90%86%E4%B9%8B%E6%95%B0%E5%AD%97%E5%8D%83%E5%88%86%E4%BD%8D%E6%A0%BC%E5%BC%8F%E5%8C%96.html</id>
    <published>2019-08-20T16:21:57.000Z</published>
    <updated>2020-10-19T01:19:56.253Z</updated>
    
    <content type="html"><![CDATA[<h2 id="场景"><a href="#场景" class="headerlink" title="场景"></a>场景</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="quote">&gt; 使用千分位格式化金额，更正式的显示</span></span><br></pre></td></tr></table></figure><h2 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h2><p><img src="https://i.loli.net/2019/08/21/z9wpms86QhHSbFr.png" alt></p><h2 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h2><figure class="highlight angelscript"><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="number">1.</span>分割整数位和小数位，处理小数位补零，或者四舍五入</span><br><span class="line"><span class="number">2.</span>获取整数位的长度 按<span class="number">3</span>分割 插入 , 号</span><br><span class="line"><span class="number">3.</span>拼接字符串 组合返回值</span><br></pre></td></tr></table></figure><h2 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h2><figure class="highlight javascript"><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></pre></td><td class="code"><pre><span class="line">    </span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 金额类数字格式化 千分位 小数点</span></span><br><span class="line"><span class="comment"> * @param &#123;*&#125; num   传入的数字</span></span><br><span class="line"><span class="comment"> * @param &#123;*&#125; f 保留的小数位数</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">const</span> moneyFormat = <span class="function">(<span class="params">num, f</span>) =&gt;</span> &#123;</span><br><span class="line">num = <span class="built_in">String</span>(num) <span class="comment">//转化为字符串</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> Old_f = <span class="literal">null</span></span><br><span class="line"><span class="keyword">if</span> (num.search(<span class="regexp">/\./</span>) &gt; <span class="number">-1</span>) &#123;</span><br><span class="line">Old_f = num.toString().split(<span class="string">"."</span>)[<span class="number">1</span>].length <span class="comment">//原始小数的位数</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (Old_f &amp;&amp; Old_f !== <span class="string">'null'</span> &amp;&amp; Old_f &lt; f) &#123; <span class="comment">//如果比目标位数小则补 “0”</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; (f - Old_f); i++) &#123;</span><br><span class="line">num += <span class="string">'0'</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">num = <span class="built_in">Math</span>.floor(<span class="built_in">Number</span>(num).toFixed(f) * (<span class="built_in">Math</span>.pow(<span class="number">10</span>, f))) + <span class="string">""</span> <span class="comment">//tofixxed到值定位数后 转换成整数</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> integer = num.slice(<span class="number">0</span>, num.length - f) + <span class="string">""</span> <span class="comment">//取转换后到字符串整数部分</span></span><br><span class="line"><span class="keyword">let</span> decimal = num.slice(num.length - f, num.length) + <span class="string">""</span> <span class="comment">//小数部分</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> thou = <span class="built_in">Math</span>.floor(integer.length / <span class="number">3</span>) <span class="comment">//thousandCentimeter 取千分位到个数</span></span><br><span class="line"><span class="keyword">if</span> (integer.length % <span class="number">3</span> == <span class="number">0</span>) &#123;</span><br><span class="line">thou = thou - <span class="number">1</span> <span class="comment">//如果完美整除则少一次循环</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">let</span> new_integer = <span class="string">''</span> <span class="comment">//新的整数位</span></span><br><span class="line"><span class="keyword">let</span> temp = <span class="number">0</span> <span class="comment">//临时坐标</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; thou + <span class="number">1</span>; i++) &#123;</span><br><span class="line"><span class="keyword">let</span> target = integer.length - (thou - i) * <span class="number">3</span> <span class="comment">//thou-1 按照 54321 这样做循环 获取分号的坐标</span></span><br><span class="line">new_integer += integer.slice(temp, target) <span class="comment">//拼接字符串</span></span><br><span class="line"><span class="keyword">if</span> (i !== thou) &#123;</span><br><span class="line">new_integer += <span class="string">','</span> <span class="comment">//过滤最后一个</span></span><br><span class="line">&#125;</span><br><span class="line">temp = target</span><br><span class="line">&#125;</span><br><span class="line">integer = new_integer</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> &#123;</span><br><span class="line">full: integer + <span class="string">'.'</span> + decimal, <span class="comment">//自动拼接字符串</span></span><br><span class="line">arr: [integer, decimal] <span class="comment">//分别返回 整数部分 和 小数部分 用于自定义样式</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;场景&quot;&gt;&lt;a href=&quot;#场景&quot; class=&quot;headerlink&quot; title=&quot;场景&quot;&gt;&lt;/a&gt;场景&lt;/h2&gt;&lt;figure class=&quot;highlight markdown&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;sp
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>测试文章-自动部署测试</title>
    <link href="https://sukeai.netlify.com/1997-01-01/hello-world.html"/>
    <id>https://sukeai.netlify.com/1997-01-01/hello-world.html</id>
    <published>1997-01-01T00:00:00.000Z</published>
    <updated>2020-10-19T01:19:56.252Z</updated>
    
    <content type="html"><![CDATA[<p>自动部署测试Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;自动部署测试Welcome to &lt;a href=&quot;https://hexo.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https:/
      
    
    </summary>
    
    
    
  </entry>
  
</feed>
