<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>狼林鱼池</title>
  
  <subtitle>风带来了种子 时间使之发芽</subtitle>
  <link href="https://blog.jiyu134.top/atom.xml" rel="self"/>
  
  <link href="https://blog.jiyu134.top/"/>
  <updated>2025-09-20T11:28:33.766Z</updated>
  <id>https://blog.jiyu134.top/</id>
  
  <author>
    <name>jiyu134</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>二维码离线传输2.0</title>
    <link href="https://blog.jiyu134.top/posts/fwu16/"/>
    <id>https://blog.jiyu134.top/posts/fwu16/</id>
    <published>2025-09-20T11:28:33.766Z</published>
    <updated>2025-09-20T11:28:33.766Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>在今年2月份的时候，我有尝试使用二维码来离线传输图片，虽然这是一个不错的想法，但是在当时并没有取得成功（属于是一个差一点就成功）。<br>不过好在我又进行了一次尝试，我选择了另一个道路来完成这个项目。<br>并且，这个2.0版本得到了升级，现在，它不仅可以适用于图片，更覆盖所有文件。<br><em>出于篇幅问题，有些地方我就不放源代码了，如果想看我与AI的对话，可以看末尾的链接。</em></p><div calss='anzhiyu-tag-link'><a class="tag-Link" target="_blank" href="https://blog.jiyu134.top/QR_code_transmission.html">    <div class="tag-link-tips">引用站外地址</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="">          <i class="anzhiyufont anzhiyu-icon-link" style=""></i>        </div>        <div class="tag-link-right">            <div class="tag-link-title">实现网站</div>            <div class="tag-link-sitename"> https://blog.jiyu134.top/QR_code_transmission.html </div>        </div>        <i class="anzhiyufont anzhiyu-icon-angle-right"></i>    </div>    </a></div><h2 id="想法？"><a href="#想法？" class="headerlink" title="想法？"></a>想法？</h2><p>我本来计划沿用之前的python来完成，因为这种方法相较于C语言较简单，但是…在我换了电脑后，我不知道在旧电脑都放了什么库进去，而且原本的文件中有一些错误，包括像二维码导出问题，识别问题。<br>我对此头皮发麻，这些问题比较难以处理…<br>所以我在放弃的前一秒选择了另一个赛道——HTML<br>其实在使用它的时候我又在想，html可不可以实现我的想法？我起初有些害怕。但在我用AI生成的时候，居然成功了！<br>我很惊讶，赶忙对这个项目进行了跟进处理。</p><h2 id="成功…了？"><a href="#成功…了？" class="headerlink" title="成功…了？"></a>成功…了？</h2><p>在和AI进行多次交涉之后，第一个版本出现了。<br>注：第一个版本是python<br>结构：<br><strong>项目结构建议</strong>:</p><figure class="highlight plaintext"><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">qr_file_transfer/</span><br><span class="line">├── app.py              # Flask 主应用</span><br><span class="line">├── templates/</span><br><span class="line">│   ├── index.html      # 上传和展示页面</span><br><span class="line">│   └── scanner.html    # 扫描页面 (基础)</span><br><span class="line">├── static/</span><br><span class="line">│   └── styles.css      # 样式文件</span><br><span class="line">├── uploads/            # 上传文件临时存储</span><br><span class="line">├── qr_codes/           # 生成的二维码图片存储</span><br><span class="line">└── received_files/     # 接收端重组后的文件存储</span><br></pre></td></tr></table></figure><details class="folding-tag" ><summary> 源码 </summary>              <div class='content'>              <p><strong>1. <code>app.py</code></strong></p><figure class="highlight python"><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><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">import</span> hashlib</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> uuid</span><br><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> Flask, request, render_template, send_file, jsonify, redirect, url_for</span><br><span class="line"><span class="keyword">import</span> qrcode</span><br><span class="line"><span class="keyword">from</span> cryptography.fernet <span class="keyword">import</span> Fernet</span><br><span class="line"></span><br><span class="line">app = Flask(__name__)</span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 配置 ---</span></span><br><span class="line">UPLOAD_FOLDER = <span class="string">&#x27;uploads&#x27;</span></span><br><span class="line">QR_CODE_FOLDER = <span class="string">&#x27;qr_codes&#x27;</span></span><br><span class="line">RECEIVED_FOLDER = <span class="string">&#x27;received_files&#x27;</span></span><br><span class="line">app.config[<span class="string">&#x27;UPLOAD_FOLDER&#x27;</span>] = UPLOAD_FOLDER</span><br><span class="line">app.config[<span class="string">&#x27;QR_CODE_FOLDER&#x27;</span>] = QR_CODE_FOLDER</span><br><span class="line">app.config[<span class="string">&#x27;RECEIVED_FOLDER&#x27;</span>] = RECEIVED_FOLDER</span><br><span class="line"></span><br><span class="line"><span class="comment"># 确保目录存在</span></span><br><span class="line">os.makedirs(UPLOAD_FOLDER, exist_ok=<span class="literal">True</span>)</span><br><span class="line">os.makedirs(QR_CODE_FOLDER, exist_ok=<span class="literal">True</span>)</span><br><span class="line">os.makedirs(RECEIVED_FOLDER, exist_ok=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 存储传输会话信息 &#123;session_id: &#123;&#x27;key&#x27;: key, &#x27;chunks&#x27;: [...], &#x27;metadata&#x27;: &#123;...&#125;&#125;&#125;</span></span><br><span class="line">transfer_sessions = &#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 辅助函数 ---</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">calculate_sha256</span>(<span class="params">file_path</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;计算文件的 SHA-256 哈希值&quot;&quot;&quot;</span></span><br><span class="line">    sha256_hash = hashlib.sha256()</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(file_path, <span class="string">&quot;rb&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        <span class="comment"># Read and update hash string value in blocks of 4K</span></span><br><span class="line">        <span class="keyword">for</span> byte_block <span class="keyword">in</span> <span class="built_in">iter</span>(<span class="keyword">lambda</span>: f.read(<span class="number">4096</span>), <span class="string">b&quot;&quot;</span>):</span><br><span class="line">            sha256_hash.update(byte_block)</span><br><span class="line">    <span class="keyword">return</span> sha256_hash.hexdigest()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">split_data</span>(<span class="params">data, chunk_size</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;将字节数据分割成指定大小的块&quot;&quot;&quot;</span></span><br><span class="line">    chunks = []</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(data), chunk_size):</span><br><span class="line">        chunks.append(data[i:i + chunk_size])</span><br><span class="line">    <span class="keyword">return</span> chunks</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">generate_qr_code</span>(<span class="params">data_str, filename</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;生成二维码并保存为文件&quot;&quot;&quot;</span></span><br><span class="line">    qr = qrcode.QRCode(</span><br><span class="line">        version=<span class="number">1</span>,</span><br><span class="line">        error_correction=qrcode.constants.ERROR_CORRECT_L,</span><br><span class="line">        box_size=<span class="number">10</span>,</span><br><span class="line">        border=<span class="number">4</span>,</span><br><span class="line">    )</span><br><span class="line">    qr.add_data(data_str)</span><br><span class="line">    qr.make(fit=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">    img = qr.make_image(fill_color=<span class="string">&quot;black&quot;</span>, back_color=<span class="string">&quot;white&quot;</span>)</span><br><span class="line">    img.save(os.path.join(app.config[<span class="string">&#x27;QR_CODE_FOLDER&#x27;</span>], filename))</span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 路由 ---</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/&#x27;</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">index</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;主页 - 文件上传&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> render_template(<span class="string">&#x27;index.html&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/upload&#x27;</span>, methods=[<span class="string">&#x27;POST&#x27;</span>]</span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">upload_file</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;处理文件上传和二维码生成&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="string">&#x27;files&#x27;</span> <span class="keyword">not</span> <span class="keyword">in</span> request.files:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;No file part&quot;</span>, <span class="number">400</span></span><br><span class="line">    files = request.files.getlist(<span class="string">&#x27;files&#x27;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> files <span class="keyword">or</span> <span class="built_in">all</span>(f.filename == <span class="string">&#x27;&#x27;</span> <span class="keyword">for</span> f <span class="keyword">in</span> files):</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;No selected file&quot;</span>, <span class="number">400</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 获取用户设置</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        chunk_size_kb = <span class="built_in">int</span>(request.form.get(<span class="string">&#x27;chunk_size&#x27;</span>, <span class="number">100</span>)) <span class="comment"># 默认100KB</span></span><br><span class="line">        display_speed = <span class="built_in">int</span>(request.form.get(<span class="string">&#x27;display_speed&#x27;</span>, <span class="number">2</span>)) <span class="comment"># 默认2张/秒</span></span><br><span class="line">    <span class="keyword">except</span> ValueError:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;Invalid input for chunk size or display speed&quot;</span>, <span class="number">400</span></span><br><span class="line"></span><br><span class="line">    chunk_size_bytes = chunk_size_kb * <span class="number">1024</span></span><br><span class="line">    delay_ms = <span class="built_in">int</span>(<span class="number">1000</span> / display_speed) <span class="keyword">if</span> display_speed &gt; <span class="number">0</span> <span class="keyword">else</span> <span class="number">500</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 为本次传输创建唯一会话ID和加密密钥</span></span><br><span class="line">    session_id = <span class="built_in">str</span>(uuid.uuid4())</span><br><span class="line">    key = Fernet.generate_key()</span><br><span class="line">    cipher_suite = Fernet(key)</span><br><span class="line">    </span><br><span class="line">    uploaded_files_info = []</span><br><span class="line">    all_chunks_data = [] <span class="comment"># 存储所有文件的加密块数据</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 1. 处理每个上传的文件</span></span><br><span class="line">    <span class="keyword">for</span> file <span class="keyword">in</span> files:</span><br><span class="line">        <span class="keyword">if</span> file:</span><br><span class="line">            filename = file.filename</span><br><span class="line">            filepath = os.path.join(app.config[<span class="string">&#x27;UPLOAD_FOLDER&#x27;</span>], filename)</span><br><span class="line">            file.save(filepath)</span><br><span class="line">            </span><br><span class="line">            file_size = os.path.getsize(filepath)</span><br><span class="line">            file_hash = calculate_sha256(filepath)</span><br><span class="line">            file_type = file.content_type <span class="keyword">or</span> <span class="string">&#x27;unknown&#x27;</span></span><br><span class="line"></span><br><span class="line">            <span class="comment"># 读取文件内容并Base64编码</span></span><br><span class="line">            <span class="keyword">with</span> <span class="built_in">open</span>(filepath, <span class="string">&#x27;rb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">                file_content = f.read()</span><br><span class="line">            encoded_content = base64.b64encode(file_content).decode(<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 准备元数据</span></span><br><span class="line">            metadata = &#123;</span><br><span class="line">                <span class="string">&#x27;filename&#x27;</span>: filename,</span><br><span class="line">                <span class="string">&#x27;size&#x27;</span>: file_size,</span><br><span class="line">                <span class="string">&#x27;type&#x27;</span>: file_type,</span><br><span class="line">                <span class="string">&#x27;sha256&#x27;</span>: file_hash</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">            data_to_encrypt = json.dumps(&#123;</span><br><span class="line">                <span class="string">&#x27;metadata&#x27;</span>: metadata,</span><br><span class="line">                <span class="string">&#x27;content&#x27;</span>: encoded_content</span><br><span class="line">            &#125;).encode(<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line"></span><br><span class="line">            encrypted_data = cipher_suite.encrypt(data_to_encrypt)</span><br><span class="line">            </span><br><span class="line">            <span class="comment"># 分割加密后的数据</span></span><br><span class="line">            chunks = split_data(encrypted_data, chunk_size_bytes)</span><br><span class="line">            all_chunks_data.extend([(chunk, filename) <span class="keyword">for</span> chunk <span class="keyword">in</span> chunks]) <span class="comment"># 保存块和文件名关联</span></span><br><span class="line"></span><br><span class="line">            uploaded_files_info.append(&#123;</span><br><span class="line">                <span class="string">&#x27;name&#x27;</span>: filename,</span><br><span class="line">                <span class="string">&#x27;size&#x27;</span>: file_size,</span><br><span class="line">                <span class="string">&#x27;hash&#x27;</span>: file_hash</span><br><span class="line">            &#125;)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 2. 为所有块创建二维码</span></span><br><span class="line">    qr_filenames = []</span><br><span class="line">    total_chunks = <span class="built_in">len</span>(all_chunks_data)</span><br><span class="line">    <span class="keyword">for</span> i, (chunk_data, filename) <span class="keyword">in</span> <span class="built_in">enumerate</span>(all_chunks_data):</span><br><span class="line">        <span class="comment"># 构造二维码数据：会话ID, 块索引, 总块数, 文件名标识, 加密块数据</span></span><br><span class="line">        <span class="comment"># 为了简化，我们将密钥也编码进去（第一个二维码）</span></span><br><span class="line">        qr_data_dict = &#123;</span><br><span class="line">            <span class="string">&#x27;session_id&#x27;</span>: session_id,</span><br><span class="line">            <span class="string">&#x27;index&#x27;</span>: i,</span><br><span class="line">            <span class="string">&#x27;total&#x27;</span>: total_chunks,</span><br><span class="line">            <span class="string">&#x27;filename&#x27;</span>: filename,</span><br><span class="line">            <span class="string">&#x27;data&#x27;</span>: base64.b64encode(chunk_data).decode(<span class="string">&#x27;utf-8&#x27;</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="keyword">if</span> i == <span class="number">0</span>:</span><br><span class="line">            qr_data_dict[<span class="string">&#x27;key&#x27;</span>] = key.decode(<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line"></span><br><span class="line">        qr_data_str = json.dumps(qr_data_dict)</span><br><span class="line">        qr_filename = <span class="string">f&quot;qr_<span class="subst">&#123;session_id&#125;</span>_<span class="subst">&#123;i&#125;</span>.png&quot;</span></span><br><span class="line">        generate_qr_code(qr_data_str, qr_filename)</span><br><span class="line">        qr_filenames.append(qr_filename)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 3. 存储会话信息 (虽然本次简化了密钥分发，但保留结构)</span></span><br><span class="line">    transfer_sessions[session_id] = &#123;</span><br><span class="line">        <span class="string">&#x27;key&#x27;</span>: key.decode(<span class="string">&#x27;utf-8&#x27;</span>), <span class="comment"># 存储为字符串</span></span><br><span class="line">        <span class="string">&#x27;total_chunks&#x27;</span>: total_chunks,</span><br><span class="line">        <span class="string">&#x27;chunks_received&#x27;</span>: &#123;&#125;, <span class="comment"># &#123;index: data&#125;</span></span><br><span class="line">        <span class="string">&#x27;files_info&#x27;</span>: uploaded_files_info</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 4. 渲染展示页面</span></span><br><span class="line">    <span class="keyword">return</span> render_template(<span class="string">&#x27;index.html&#x27;</span>, </span><br><span class="line">                           qr_files=qr_filenames, </span><br><span class="line">                           delay_ms=delay_ms,</span><br><span class="line">                           session_id=session_id,</span><br><span class="line">                           files_info=uploaded_files_info)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 接收端模拟 (简化版，实际需要前端JS扫描) ---</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/scanner&#x27;</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">scanner</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;扫描页面&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> render_template(<span class="string">&#x27;scanner.html&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 模拟接收端扫描并重组文件的API端点</span></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/receive_chunk&#x27;</span>, methods=[<span class="string">&#x27;POST&#x27;</span>]</span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">receive_chunk</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;接收扫描到的二维码数据块 (模拟)&quot;&quot;&quot;</span></span><br><span class="line">    data = request.json</span><br><span class="line">    qr_data_str = data.get(<span class="string">&#x27;qr_data&#x27;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> qr_data_str:</span><br><span class="line">        <span class="keyword">return</span> jsonify(&#123;<span class="string">&#x27;status&#x27;</span>: <span class="string">&#x27;error&#x27;</span>, <span class="string">&#x27;message&#x27;</span>: <span class="string">&#x27;No QR data received&#x27;</span>&#125;), <span class="number">400</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        qr_data = json.loads(qr_data_str)</span><br><span class="line">    <span class="keyword">except</span> json.JSONDecodeError:</span><br><span class="line">        <span class="keyword">return</span> jsonify(&#123;<span class="string">&#x27;status&#x27;</span>: <span class="string">&#x27;error&#x27;</span>, <span class="string">&#x27;message&#x27;</span>: <span class="string">&#x27;Invalid QR data format&#x27;</span>&#125;), <span class="number">400</span></span><br><span class="line"></span><br><span class="line">    session_id = qr_data.get(<span class="string">&#x27;session_id&#x27;</span>)</span><br><span class="line">    index = qr_data.get(<span class="string">&#x27;index&#x27;</span>)</span><br><span class="line">    total = qr_data.get(<span class="string">&#x27;total&#x27;</span>)</span><br><span class="line">    filename = qr_data.get(<span class="string">&#x27;filename&#x27;</span>)</span><br><span class="line">    encrypted_chunk_b64 = qr_data.get(<span class="string">&#x27;data&#x27;</span>)</span><br><span class="line">    key_str = qr_data.get(<span class="string">&#x27;key&#x27;</span>) <span class="comment"># 可能来自第一个二维码</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> session_id <span class="keyword">or</span> index <span class="keyword">is</span> <span class="literal">None</span> <span class="keyword">or</span> total <span class="keyword">is</span> <span class="literal">None</span> <span class="keyword">or</span> <span class="keyword">not</span> encrypted_chunk_b64:</span><br><span class="line">        <span class="keyword">return</span> jsonify(&#123;<span class="string">&#x27;status&#x27;</span>: <span class="string">&#x27;error&#x27;</span>, <span class="string">&#x27;message&#x27;</span>: <span class="string">&#x27;Missing data in QR code&#x27;</span>&#125;), <span class="number">400</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 检查或创建会话</span></span><br><span class="line">    <span class="keyword">if</span> session_id <span class="keyword">not</span> <span class="keyword">in</span> transfer_sessions:</span><br><span class="line">        transfer_sessions[session_id] = &#123;</span><br><span class="line">            <span class="string">&#x27;key&#x27;</span>: key_str, <span class="comment"># 从第一个二维码获取</span></span><br><span class="line">            <span class="string">&#x27;total_chunks&#x27;</span>: total,</span><br><span class="line">            <span class="string">&#x27;chunks_received&#x27;</span>: &#123;&#125;,</span><br><span class="line">            <span class="string">&#x27;files_info&#x27;</span>: &#123;&#125; <span class="comment"># 简化处理</span></span><br><span class="line">        &#125;</span><br><span class="line">    <span class="keyword">elif</span> key_str:</span><br><span class="line">         transfer_sessions[session_id][<span class="string">&#x27;key&#x27;</span>] = key_str <span class="comment"># 更新密钥（如果第一个二维码后扫到）</span></span><br><span class="line"></span><br><span class="line">    session = transfer_sessions[session_id]</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 解密块</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        cipher_suite = Fernet(session[<span class="string">&#x27;key&#x27;</span>].encode(<span class="string">&#x27;utf-8&#x27;</span>))</span><br><span class="line">        encrypted_chunk = base64.b64decode(encrypted_chunk_b64)</span><br><span class="line">        decrypted_chunk = cipher_suite.decrypt(encrypted_chunk)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 解析解密后的内容</span></span><br><span class="line">        chunk_data = json.loads(decrypted_chunk.decode(<span class="string">&#x27;utf-8&#x27;</span>))</span><br><span class="line">        <span class="comment"># 这里可以进一步处理 chunk_data[&#x27;metadata&#x27;] 和 chunk_data[&#x27;content&#x27;]</span></span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 存储解密后的内容（或原始加密块，取决于重组策略）</span></span><br><span class="line">        session[<span class="string">&#x27;chunks_received&#x27;</span>][index] = &#123;</span><br><span class="line">            <span class="string">&#x27;data&#x27;</span>: chunk_data, <span class="comment"># 存储解密后的完整数据</span></span><br><span class="line">            <span class="string">&#x27;filename&#x27;</span>: filename</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="keyword">return</span> jsonify(&#123;<span class="string">&#x27;status&#x27;</span>: <span class="string">&#x27;error&#x27;</span>, <span class="string">&#x27;message&#x27;</span>: <span class="string">f&#x27;Decryption failed: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&#x27;</span>&#125;), <span class="number">500</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 检查是否所有块都已接收</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(session[<span class="string">&#x27;chunks_received&#x27;</span>]) == session[<span class="string">&#x27;total_chunks&#x27;</span>]:</span><br><span class="line">        <span class="comment"># 重组文件</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="comment"># 按索引排序</span></span><br><span class="line">            sorted_chunks = <span class="built_in">sorted</span>(session[<span class="string">&#x27;chunks_received&#x27;</span>].items())</span><br><span class="line">            </span><br><span class="line">            <span class="comment"># 假设只有一个文件，或按filename分组处理</span></span><br><span class="line">            <span class="comment"># 这里简化为处理第一个文件</span></span><br><span class="line">            <span class="keyword">if</span> sorted_chunks:</span><br><span class="line">                <span class="comment"># 重新组装内容 (需要按文件名分组)</span></span><br><span class="line">                files_content = &#123;&#125;</span><br><span class="line">                <span class="keyword">for</span> idx, chunk_info <span class="keyword">in</span> sorted_chunks:</span><br><span class="line">                    fname = chunk_info[<span class="string">&#x27;filename&#x27;</span>]</span><br><span class="line">                    content = chunk_info[<span class="string">&#x27;data&#x27;</span>][<span class="string">&#x27;content&#x27;</span>] <span class="comment"># Base64内容</span></span><br><span class="line">                    <span class="keyword">if</span> fname <span class="keyword">not</span> <span class="keyword">in</span> files_content:</span><br><span class="line">                        files_content[fname] = []</span><br><span class="line">                    files_content[fname].append(content)</span><br><span class="line">                </span><br><span class="line">                <span class="keyword">for</span> fname, parts <span class="keyword">in</span> files_content.items():</span><br><span class="line">                    <span class="comment"># Base64解码所有部分并合并</span></span><br><span class="line">                    full_base64_content = <span class="string">&quot;&quot;</span>.join(parts)</span><br><span class="line">                    file_content = base64.b64decode(full_base64_content)</span><br><span class="line">                    </span><br><span class="line">                    <span class="comment"># 保存文件</span></span><br><span class="line">                    output_path = os.path.join(app.config[<span class="string">&#x27;RECEIVED_FOLDER&#x27;</span>], <span class="string">f&quot;received_<span class="subst">&#123;fname&#125;</span>&quot;</span>)</span><br><span class="line">                    <span class="keyword">with</span> <span class="built_in">open</span>(output_path, <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">                        f.write(file_content)</span><br><span class="line">                    </span><br><span class="line">                    <span class="comment"># 可以在这里验证SHA256 (chunk_info[&#x27;data&#x27;][&#x27;metadata&#x27;][&#x27;sha256&#x27;])</span></span><br><span class="line">                </span><br><span class="line">                <span class="comment"># 清理会话</span></span><br><span class="line">                <span class="keyword">del</span> transfer_sessions[session_id]</span><br><span class="line">                <span class="keyword">return</span> jsonify(&#123;<span class="string">&#x27;status&#x27;</span>: <span class="string">&#x27;success&#x27;</span>, <span class="string">&#x27;message&#x27;</span>: <span class="string">&#x27;File(s) received and saved.&#x27;</span>, <span class="string">&#x27;download_url&#x27;</span>: url_for(<span class="string">&#x27;download_file&#x27;</span>, filename=<span class="string">f&quot;received_<span class="subst">&#123;<span class="built_in">list</span>(files_content.keys())[<span class="number">0</span>]&#125;</span>&quot;</span>)&#125;)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">return</span> jsonify(&#123;<span class="string">&#x27;status&#x27;</span>: <span class="string">&#x27;error&#x27;</span>, <span class="string">&#x27;message&#x27;</span>: <span class="string">&#x27;No chunks to assemble&#x27;</span>&#125;), <span class="number">500</span></span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="keyword">return</span> jsonify(&#123;<span class="string">&#x27;status&#x27;</span>: <span class="string">&#x27;error&#x27;</span>, <span class="string">&#x27;message&#x27;</span>: <span class="string">f&#x27;File assembly failed: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&#x27;</span>&#125;), <span class="number">500</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> jsonify(&#123;<span class="string">&#x27;status&#x27;</span>: <span class="string">&#x27;success&#x27;</span>, <span class="string">&#x27;message&#x27;</span>: <span class="string">f&#x27;Chunk <span class="subst">&#123;index+<span class="number">1</span>&#125;</span>/<span class="subst">&#123;total&#125;</span> received&#x27;</span>&#125;)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/download/&lt;filename&gt;&#x27;</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">download_file</span>(<span class="params">filename</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;提供下载重组后的文件&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">return</span> send_file(os.path.join(app.config[<span class="string">&#x27;RECEIVED_FOLDER&#x27;</span>], filename), as_attachment=<span class="literal">True</span>)</span><br><span class="line">    <span class="keyword">except</span> FileNotFoundError:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;File not found&quot;</span>, <span class="number">404</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    app.run(debug=<span class="literal">True</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2. <code>templates/index.html</code></strong></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>QR Code File Transfer - Sender<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span> <span class="attr">href</span>=<span class="string">&quot;&#123;&#123; url_for(&#x27;static&#x27;, filename=&#x27;styles.css&#x27;) &#125;&#125;&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">h1</span>&gt;</span>QR Code File Transfer - Upload<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">form</span> <span class="attr">method</span>=<span class="string">&quot;post&quot;</span> <span class="attr">action</span>=<span class="string">&quot;/upload&quot;</span> <span class="attr">enctype</span>=<span class="string">&quot;multipart/form-data&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">label</span> <span class="attr">for</span>=<span class="string">&quot;files&quot;</span>&gt;</span>Choose files (max 25):<span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;file&quot;</span> <span class="attr">id</span>=<span class="string">&quot;files&quot;</span> <span class="attr">name</span>=<span class="string">&quot;files&quot;</span> <span class="attr">multiple</span> <span class="attr">required</span>&gt;</span><span class="tag">&lt;<span class="name">br</span>&gt;</span><span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="tag">&lt;<span class="name">label</span> <span class="attr">for</span>=<span class="string">&quot;chunk_size&quot;</span>&gt;</span>QR Code Chunk Size (KB):<span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;number&quot;</span> <span class="attr">id</span>=<span class="string">&quot;chunk_size&quot;</span> <span class="attr">name</span>=<span class="string">&quot;chunk_size&quot;</span> <span class="attr">value</span>=<span class="string">&quot;100&quot;</span> <span class="attr">min</span>=<span class="string">&quot;1&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">br</span>&gt;</span><span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="tag">&lt;<span class="name">label</span> <span class="attr">for</span>=<span class="string">&quot;display_speed&quot;</span>&gt;</span>Display Speed (QR codes/second):<span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;number&quot;</span> <span class="attr">id</span>=<span class="string">&quot;display_speed&quot;</span> <span class="attr">name</span>=<span class="string">&quot;display_speed&quot;</span> <span class="attr">value</span>=<span class="string">&quot;2&quot;</span> <span class="attr">min</span>=<span class="string">&quot;1&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">br</span>&gt;</span><span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;submit&quot;</span> <span class="attr">value</span>=<span class="string">&quot;Upload and Generate QR Codes&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">form</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    &#123;% if qr_files %&#125;</span><br><span class="line">    <span class="tag">&lt;<span class="name">hr</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">h2</span>&gt;</span>File Information:<span class="tag">&lt;/<span class="name">h2</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">ul</span>&gt;</span></span><br><span class="line">        &#123;% for file in files_info %&#125;</span><br><span class="line">            <span class="tag">&lt;<span class="name">li</span>&gt;</span>&#123;&#123; file.name &#125;&#125; (&#123;&#123; &quot;%.2f&quot; | format(file.size / 1024.0) &#125;&#125; KB, SHA256: &#123;&#123; file.hash &#125;&#125;)<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">        &#123;% endfor %&#125;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">h2</span>&gt;</span>Generated QR Codes:<span class="tag">&lt;/<span class="name">h2</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">div</span> <span class="attr">id</span>=<span class="string">&quot;slideshow-container&quot;</span>&gt;</span></span><br><span class="line">        &#123;% for qr_file in qr_files %&#125;</span><br><span class="line">            <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;mySlides&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;&#123;&#123; url_for(&#x27;static&#x27;, filename=&#x27;qr_codes/&#x27; + qr_file) &#125;&#125;&quot;</span> <span class="attr">style</span>=<span class="string">&quot;width:100%&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        &#123;% endfor %&#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">&lt;!-- Next and previous buttons --&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;prev&quot;</span> <span class="attr">onclick</span>=<span class="string">&quot;plusSlides(-1)&quot;</span>&gt;</span><span class="symbol">&amp;#10094;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;next&quot;</span> <span class="attr">onclick</span>=<span class="string">&quot;plusSlides(1)&quot;</span>&gt;</span><span class="symbol">&amp;#10095;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- The dots/circles --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot;text-align:center&quot;</span>&gt;</span></span><br><span class="line">        &#123;% for qr_file in qr_files %&#125;</span><br><span class="line">            <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;dot&quot;</span> <span class="attr">onclick</span>=<span class="string">&quot;currentSlide(&#123;&#123; loop.index &#125;&#125;)&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">        &#123;% endfor %&#125;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">h3</span>&gt;</span>Auto-Play Slideshow:<span class="tag">&lt;/<span class="name">h3</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">&quot;startSlideshow()&quot;</span>&gt;</span>Start<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">&quot;stopSlideshow()&quot;</span>&gt;</span>Stop<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>Speed: &#123;&#123; delay_ms &#125;&#125; ms per slide<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">let</span> slideIndex = <span class="number">1</span>;</span></span><br><span class="line"><span class="language-javascript">        <span class="title function_">showSlides</span>(slideIndex);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">let</span> slideInterval = <span class="literal">null</span>;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> delay = &#123;&#123; delay_ms &#125;&#125;; <span class="comment">// milliseconds</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">function</span> <span class="title function_">plusSlides</span>(<span class="params">n</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="title function_">showSlides</span>(slideIndex += n);</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">function</span> <span class="title function_">currentSlide</span>(<span class="params">n</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="title function_">showSlides</span>(slideIndex = n);</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">function</span> <span class="title function_">showSlides</span>(<span class="params">n</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">let</span> i;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">let</span> slides = <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&quot;mySlides&quot;</span>);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">let</span> dots = <span class="variable language_">document</span>.<span class="title function_">getElementsByClassName</span>(<span class="string">&quot;dot&quot;</span>);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (n &gt; slides.<span class="property">length</span>) &#123;slideIndex = <span class="number">1</span>&#125;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (n &lt; <span class="number">1</span>) &#123;slideIndex = slides.<span class="property">length</span>&#125;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; slides.<span class="property">length</span>; i++) &#123;</span></span><br><span class="line"><span class="language-javascript">                slides[i].<span class="property">style</span>.<span class="property">display</span> = <span class="string">&quot;none&quot;</span>;</span></span><br><span class="line"><span class="language-javascript">            &#125;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; dots.<span class="property">length</span>; i++) &#123;</span></span><br><span class="line"><span class="language-javascript">                dots[i].<span class="property">className</span> = dots[i].<span class="property">className</span>.<span class="title function_">replace</span>(<span class="string">&quot; active&quot;</span>, <span class="string">&quot;&quot;</span>);</span></span><br><span class="line"><span class="language-javascript">            &#125;</span></span><br><span class="line"><span class="language-javascript">            slides[slideIndex-<span class="number">1</span>].<span class="property">style</span>.<span class="property">display</span> = <span class="string">&quot;block&quot;</span>;</span></span><br><span class="line"><span class="language-javascript">            dots[slideIndex-<span class="number">1</span>].<span class="property">className</span> += <span class="string">&quot; active&quot;</span>;</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">function</span> <span class="title function_">startSlideshow</span>(<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (slideInterval) <span class="title function_">stopSlideshow</span>(); <span class="comment">// Prevent multiple intervals</span></span></span><br><span class="line"><span class="language-javascript">            slideInterval = <span class="built_in">setInterval</span>(<span class="function">() =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="title function_">plusSlides</span>(<span class="number">1</span>);</span></span><br><span class="line"><span class="language-javascript">            &#125;, delay);</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">function</span> <span class="title function_">stopSlideshow</span>(<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="built_in">clearInterval</span>(slideInterval);</span></span><br><span class="line"><span class="language-javascript">            slideInterval = <span class="literal">null</span>;</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="comment">// Optional: Start automatically</span></span></span><br><span class="line"><span class="language-javascript">        <span class="comment">// window.onload = function() &#123; startSlideshow(); &#125;</span></span></span><br><span class="line"><span class="language-javascript">    </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">    &#123;% endif %&#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>3. <code>templates/scanner.html</code></strong></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>QR Code File Transfer - Receiver<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#video</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">max-width</span>: <span class="number">600px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: auto;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border</span>: <span class="number">1px</span> solid black;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#result</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-top</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#ccc</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: <span class="number">#f9f9f9</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">h1</span>&gt;</span>QR Code File Transfer - Receiver<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>Point your camera at the QR codes being displayed on the sender&#x27;s screen.<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment">&lt;!-- Scanner UI (需要集成 jsQR 或类似库) --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">video</span> <span class="attr">id</span>=<span class="string">&quot;video&quot;</span> <span class="attr">width</span>=<span class="string">&quot;300&quot;</span> <span class="attr">height</span>=<span class="string">&quot;200&quot;</span> <span class="attr">autoplay</span> <span class="attr">muted</span>&gt;</span><span class="tag">&lt;/<span class="name">video</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">&quot;startButton&quot;</span>&gt;</span>Start Camera<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">&quot;stopButton&quot;</span>&gt;</span>Stop Camera<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;result&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">p</span>&gt;</span>Status: Waiting to start scanning...<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">p</span> <span class="attr">id</span>=<span class="string">&quot;scanInfo&quot;</span>&gt;</span>Scanned: 0 / 0<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">p</span> <span class="attr">id</span>=<span class="string">&quot;speedInfo&quot;</span>&gt;</span>Speed: 0 Kb/s<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">p</span> <span class="attr">id</span>=<span class="string">&quot;message&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://cdn.jsdelivr.net/npm/jsqr@1.4.0/dist/jsQR.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> video = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;video&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> startButton = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;startButton&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> stopButton = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;stopButton&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> resultDiv = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;result&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> scanInfo = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;scanInfo&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> speedInfo = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;speedInfo&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> messageP = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;message&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">let</span> stream = <span class="literal">null</span>;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">let</span> scanning = <span class="literal">false</span>;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">let</span> lastScanTime = <span class="number">0</span>;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">let</span> lastScanCount = <span class="number">0</span>;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> constraints = &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="attr">video</span>: &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">facingMode</span>: <span class="string">&quot;environment&quot;</span>, <span class="comment">// Prefer back camera on mobile</span></span></span><br><span class="line"><span class="language-javascript">                <span class="attr">width</span>: &#123; <span class="attr">ideal</span>: <span class="number">1280</span> &#125;,</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">height</span>: &#123; <span class="attr">ideal</span>: <span class="number">720</span> &#125;</span></span><br><span class="line"><span class="language-javascript">            &#125;</span></span><br><span class="line"><span class="language-javascript">        &#125;;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        startButton.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="keyword">async</span> () =&gt; &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">try</span> &#123;</span></span><br><span class="line"><span class="language-javascript">                stream = <span class="keyword">await</span> navigator.<span class="property">mediaDevices</span>.<span class="title function_">getUserMedia</span>(constraints);</span></span><br><span class="line"><span class="language-javascript">                video.<span class="property">srcObject</span> = stream;</span></span><br><span class="line"><span class="language-javascript">                scanning = <span class="literal">true</span>;</span></span><br><span class="line"><span class="language-javascript">                lastScanTime = performance.<span class="title function_">now</span>();</span></span><br><span class="line"><span class="language-javascript">                lastScanCount = <span class="number">0</span>;</span></span><br><span class="line"><span class="language-javascript">                <span class="title function_">scanContinuously</span>();</span></span><br><span class="line"><span class="language-javascript">            &#125; <span class="keyword">catch</span> (err) &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&quot;Error accessing media devices:&quot;</span>, err);</span></span><br><span class="line"><span class="language-javascript">                messageP.<span class="property">textContent</span> = <span class="string">&quot;Error accessing camera: &quot;</span> + err.<span class="property">message</span>;</span></span><br><span class="line"><span class="language-javascript">            &#125;</span></span><br><span class="line"><span class="language-javascript">        &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        stopButton.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">            scanning = <span class="literal">false</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (stream) &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="keyword">const</span> tracks = stream.<span class="title function_">getTracks</span>();</span></span><br><span class="line"><span class="language-javascript">                tracks.<span class="title function_">forEach</span>(<span class="function"><span class="params">track</span> =&gt;</span> track.<span class="title function_">stop</span>());</span></span><br><span class="line"><span class="language-javascript">                video.<span class="property">srcObject</span> = <span class="literal">null</span>;</span></span><br><span class="line"><span class="language-javascript">            &#125;</span></span><br><span class="line"><span class="language-javascript">            messageP.<span class="property">textContent</span> = <span class="string">&quot;Camera stopped.&quot;</span>;</span></span><br><span class="line"><span class="language-javascript">        &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">function</span> <span class="title function_">scanContinuously</span>(<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (!scanning) <span class="keyword">return</span>;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">            <span class="comment">// Use jsQR to scan the video element</span></span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> canvasElement = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;canvas&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> canvas = canvasElement.<span class="title function_">getContext</span>(<span class="string">&#x27;2d&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            canvasElement.<span class="property">width</span> = video.<span class="property">videoWidth</span>;</span></span><br><span class="line"><span class="language-javascript">            canvasElement.<span class="property">height</span> = video.<span class="property">videoHeight</span>;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">            canvas.<span class="title function_">drawImage</span>(video, <span class="number">0</span>, <span class="number">0</span>, canvasElement.<span class="property">width</span>, canvasElement.<span class="property">height</span>);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> imageData = canvas.<span class="title function_">getImageData</span>(<span class="number">0</span>, <span class="number">0</span>, canvasElement.<span class="property">width</span>, canvasElement.<span class="property">height</span>);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> code = <span class="title function_">jsQR</span>(imageData.<span class="property">data</span>, imageData.<span class="property">width</span>, imageData.<span class="property">height</span>, &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">inversionAttempts</span>: <span class="string">&quot;dontInvert&quot;</span>,</span></span><br><span class="line"><span class="language-javascript">            &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (code) &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;Scanned QR Code Data:&quot;</span>, code.<span class="property">data</span>);</span></span><br><span class="line"><span class="language-javascript">                <span class="comment">// Send data to backend</span></span></span><br><span class="line"><span class="language-javascript">                <span class="title function_">fetch</span>(<span class="string">&#x27;/receive_chunk&#x27;</span>, &#123;</span></span><br><span class="line"><span class="language-javascript">                    <span class="attr">method</span>: <span class="string">&#x27;POST&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">                    <span class="attr">headers</span>: &#123;</span></span><br><span class="line"><span class="language-javascript">                        <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/json&#x27;</span></span></span><br><span class="line"><span class="language-javascript">                    &#125;,</span></span><br><span class="line"><span class="language-javascript">                    <span class="attr">body</span>: <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(&#123; <span class="attr">qr_data</span>: code.<span class="property">data</span> &#125;)</span></span><br><span class="line"><span class="language-javascript">                &#125;)</span></span><br><span class="line"><span class="language-javascript">                .<span class="title function_">then</span>(<span class="function"><span class="params">response</span> =&gt;</span> response.<span class="title function_">json</span>())</span></span><br><span class="line"><span class="language-javascript">                .<span class="title function_">then</span>(<span class="function"><span class="params">data</span> =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">                    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;Success:&#x27;</span>, data);</span></span><br><span class="line"><span class="language-javascript">                    messageP.<span class="property">textContent</span> = data.<span class="property">message</span> || <span class="string">&quot;Chunk processed.&quot;</span>;</span></span><br><span class="line"><span class="language-javascript">                    <span class="keyword">if</span> (data.<span class="property">status</span> === <span class="string">&#x27;success&#x27;</span> &amp;&amp; data.<span class="property">download_url</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">                         messageP.<span class="property">innerHTML</span> += <span class="string">` &lt;a href=&quot;<span class="subst">$&#123;data.download_url&#125;</span>&quot; download&gt;Download File&lt;/a&gt;`</span>;</span></span><br><span class="line"><span class="language-javascript">                    &#125;</span></span><br><span class="line"><span class="language-javascript">                    <span class="comment">// Update scan info (this is simplified, you&#x27;d need backend state)</span></span></span><br><span class="line"><span class="language-javascript">                    lastScanCount++;</span></span><br><span class="line"><span class="language-javascript">                    <span class="keyword">const</span> now = performance.<span class="title function_">now</span>();</span></span><br><span class="line"><span class="language-javascript">                    <span class="keyword">const</span> elapsedSeconds = (now - lastScanTime) / <span class="number">1000</span>;</span></span><br><span class="line"><span class="language-javascript">                    <span class="keyword">if</span> (elapsedSeconds &gt; <span class="number">1</span>) &#123; <span class="comment">// Update speed every second</span></span></span><br><span class="line"><span class="language-javascript">                        <span class="keyword">const</span> speedKbps = (lastScanCount * <span class="number">100</span> <span class="comment">/* avg chunk size estimate kb */</span>) / elapsedSeconds;</span></span><br><span class="line"><span class="language-javascript">                        speedInfo.<span class="property">textContent</span> = <span class="string">`Speed: <span class="subst">$&#123;speedKbps.toFixed(<span class="number">2</span>)&#125;</span> Kb/s`</span>;</span></span><br><span class="line"><span class="language-javascript">                        lastScanTime = now;</span></span><br><span class="line"><span class="language-javascript">                        lastScanCount = <span class="number">0</span>;</span></span><br><span class="line"><span class="language-javascript">                    &#125;</span></span><br><span class="line"><span class="language-javascript">                    scanInfo.<span class="property">textContent</span> = <span class="string">`Scanned: <span class="subst">$&#123;lastScanCount&#125;</span> (est.)`</span>; <span class="comment">// Placeholder</span></span></span><br><span class="line"><span class="language-javascript">                &#125;)</span></span><br><span class="line"><span class="language-javascript">                .<span class="title function_">catch</span>(<span class="function">(<span class="params">error</span>) =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">                    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;Error:&#x27;</span>, error);</span></span><br><span class="line"><span class="language-javascript">                    messageP.<span class="property">textContent</span> = <span class="string">&quot;Error sending  &quot;</span> + error;</span></span><br><span class="line"><span class="language-javascript">                &#125;);</span></span><br><span class="line"><span class="language-javascript">            &#125;</span></span><br><span class="line"><span class="language-javascript">            <span class="comment">// Continue scanning</span></span></span><br><span class="line"><span class="language-javascript">            <span class="title function_">requestAnimationFrame</span>(scanContinuously);</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="comment">// Initial check for API support</span></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">if</span> (!navigator.<span class="property">mediaDevices</span> || !navigator.<span class="property">mediaDevices</span>.<span class="property">getUserMedia</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            messageP.<span class="property">textContent</span> = <span class="string">&quot;Your browser does not support camera access.&quot;</span>;</span></span><br><span class="line"><span class="language-javascript">            startButton.<span class="property">disabled</span> = <span class="literal">true</span>;</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">if</span> (!<span class="variable language_">window</span>.<span class="property">jsQR</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">             messageP.<span class="property">textContent</span> = <span class="string">&quot;QR code scanning library (jsQR) failed to load.&quot;</span>;</span></span><br><span class="line"><span class="language-javascript">             startButton.<span class="property">disabled</span> = <span class="literal">true</span>;</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>4. <code>static/styles.css</code></strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/* Slideshow container */</span></span><br><span class="line"><span class="selector-id">#slideshow-container</span> &#123;</span><br><span class="line">  <span class="attribute">max-width</span>: <span class="number">1000px</span>;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">margin</span>: auto;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* Hide the images by default */</span></span><br><span class="line"><span class="selector-class">.mySlides</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: none;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* Next &amp; previous buttons */</span></span><br><span class="line"><span class="selector-class">.prev</span>, <span class="selector-class">.next</span> &#123;</span><br><span class="line">  <span class="attribute">cursor</span>: pointer;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">width</span>: auto;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">16px</span>;</span><br><span class="line">  <span class="attribute">margin-top</span>: -<span class="number">22px</span>;</span><br><span class="line">  <span class="attribute">color</span>: white;</span><br><span class="line">  <span class="attribute">font-weight</span>: bold;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">18px</span>;</span><br><span class="line">  <span class="attribute">transition</span>: <span class="number">0.6s</span> ease;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">0</span> <span class="number">3px</span> <span class="number">3px</span> <span class="number">0</span>;</span><br><span class="line">  user-select: none;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* Position the &quot;next button&quot; to the right */</span></span><br><span class="line"><span class="selector-class">.next</span> &#123;</span><br><span class="line">  <span class="attribute">right</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">3px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">3px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* On hover, add a black background color with a little bit see-through */</span></span><br><span class="line"><span class="selector-class">.prev</span><span class="selector-pseudo">:hover</span>, <span class="selector-class">.next</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0.8</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* Caption text */</span></span><br><span class="line"><span class="selector-class">.text</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#f2f2f2</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">15px</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">8px</span> <span class="number">12px</span>;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">bottom</span>: <span class="number">8px</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">text-align</span>: center;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* Number text (1/3 etc) */</span></span><br><span class="line"><span class="selector-class">.numbertext</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#f2f2f2</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">12px</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">8px</span> <span class="number">12px</span>;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* The dots/bullets/indicators */</span></span><br><span class="line"><span class="selector-class">.dot</span> &#123;</span><br><span class="line">  <span class="attribute">cursor</span>: pointer;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">15px</span>;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">15px</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">2px</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#bbb</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">display</span>: inline-block;</span><br><span class="line">  <span class="attribute">transition</span>: background-color <span class="number">0.6s</span> ease;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.active</span>, <span class="selector-class">.dot</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#717171</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* Fading animation */</span></span><br><span class="line"><span class="selector-class">.fade</span> &#123;</span><br><span class="line">  <span class="attribute">animation-name</span>: fade;</span><br><span class="line">  <span class="attribute">animation-duration</span>: <span class="number">1.5s</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@keyframes</span> fade &#123;</span><br><span class="line">  <span class="selector-tag">from</span> &#123;<span class="attribute">opacity</span>: .<span class="number">4</span>&#125;</span><br><span class="line">  <span class="selector-tag">to</span> &#123;<span class="attribute">opacity</span>: <span class="number">1</span>&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>              </div>            </details><p>实际上，这个代码有问题，而且问题还不小。<br>为了不拉长战线，我们直接跳到HTML的第一个版本：</p><div class="note success no-icon flat"><p>我询问AI的问题:<br>如果将该项目写成可以放在github静态托管的全网页形式，生成的文件（包括但不限于二维码文件，扫描后结果图）放在缓存里，后期可供用户下载，又应该怎么写？请你输出完整代码，框架。以及实现方式</p></div><p>没想到AI还真的得到了我想初期达到的效果：</p><details class="folding-tag" ><summary> 详细信息 </summary>              <div class='content'>              <ol><li><p><strong>核心技术</strong>：</p><ul><li><strong>HTML&#x2F;CSS&#x2F;JavaScript</strong>: 核心前端技术。</li><li><strong>Web APIs</strong>:<ul><li><code>FileReader API</code>: 读取用户上传的文件。</li><li><code>Web Crypto API</code>: 实现加密解密（我们将使用对称加密 AES-GCM 替代 ECC，因为 Web Crypto 对 ECC 的支持更偏向于密钥协商 ECDH）。</li><li><code>getUserMedia API</code>: 调用摄像头。</li><li><code>Canvas API</code>: 用于二维码生成和扫描。</li><li><code>jsQR Library</code>: 在浏览器中扫描二维码。</li><li><code>qrious or kjua Library</code>: 在浏览器中生成二维码。</li><li><code>Cache API</code> 或 <code>IndexedDB</code>: 存储生成的二维码图片和接收的文件（更推荐 IndexedDB，因为它更强大且持久）。</li><li><code>Blob URL</code>: 为存储在内存或 IndexedDB 中的文件创建临时下载链接。</li></ul></li><li><strong>Web Workers (可选)</strong>: 对于大文件的加密&#x2F;解密或二维码生成，可以放到 Web Worker 中执行，避免阻塞主线程。</li><li><strong>模块化 (ES6 Modules)</strong>: 组织代码，使其更清晰。</li></ul></li><li><p><strong>发送端 (Sender) 流程</strong>:</p><ul><li>用户选择文件（多个）。</li><li>前端 JavaScript 读取文件，计算 SHA-256。</li><li>将文件内容转换为 Base64。</li><li>按用户指定的块大小分割 Base64 字符串。</li><li>为本次传输生成一个随机的 AES-GCM 密钥。</li><li>使用 AES-GCM 密钥加密每个数据块。</li><li>按照文档格式拼接每个块的数据字符串（包含文件名、大小、类型、SHA256、索引、总数）。</li><li>将密钥（用一个固定的“主密钥”加密，或者直接放在第一个二维码里）和第一个加密块的数据字符串组合，作为第一个二维码的内容。后续二维码只包含加密块数据字符串。</li><li>使用 JavaScript 库（如 <code>qrious</code>）将每个数据字符串生成二维码图片（<code>&lt;canvas&gt;</code> 或 <code>data:image</code> URL）。</li><li>将生成的二维码图片（或其数据）和原始文件信息存储到 <code>IndexedDB</code>。</li><li>在网页上以幻灯片形式展示二维码。</li></ul></li><li><p><strong>接收端 (Receiver) 流程</strong>:</p><ul><li>用户点击“开始扫描”按钮，调用摄像头。</li><li>使用 <code>jsQR</code> 持续扫描视频流中的二维码。</li><li>解析扫描到的二维码数据。</li><li>如果是第一个二维码，从中提取 AES-GCM 密钥（并解密，如果之前被加密）。</li><li>使用 AES-GCM 密钥解密每个扫描到的块。</li><li>解析解密后的数据，提取文件名、内容、索引等信息。</li><li>将解密后的块按索引存储在内存或 <code>IndexedDB</code> 中。</li><li>在 UI 上显示扫描进度（已扫描&#x2F;总数）。</li><li>计算并显示扫描速度。</li><li>当所有块都接收完毕后：<ul><li>按索引顺序拼接所有块的 Base64 内容。</li><li>对拼接后的 Base64 进行解码，得到原始文件的 <code>ArrayBuffer</code> 或 <code>Blob</code>。</li><li>计算重组后文件的 SHA-256 并与元数据中的进行比对（可选，增加可靠性）。</li><li>将重组后的文件 <code>Blob</code> 存储到 <code>IndexedDB</code>。</li><li>在页面上提供一个下载链接（使用 <code>URL.createObjectURL(blob)</code>）。</li></ul></li></ul></li><li><p><strong>文件存储与下载</strong>:</p><ul><li><strong>IndexedDB</strong>: 使用浏览器的 IndexedDB API 来持久化存储：<ul><li>生成的二维码图片数据 (Base64 或 Blob)。</li><li>原始文件的元数据和 Base64 内容（发送端，用于重新生成）。</li><li>接收端解密并重组后的文件 <code>Blob</code>。</li></ul></li><li><strong>下载</strong>: 当用户需要下载文件时，从 IndexedDB 读取文件 <code>Blob</code>，然后使用 <code>URL.createObjectURL(blob)</code> 创建一个临时的下载链接。</li></ul></li></ol>              </div>            </details><p>其中，对称加密 AES-GCM是我之前提出的要求，因为我担心ECC加密在这里会有点过于复杂，所以我让AI挑了一个简单些的。<br>但是不得不说，这个问题也是有的。<br>它的项目结构如下</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">qr-file-transfer-frontend/</span><br><span class="line">├── index.html              # 主页面 (包含发送和接收的入口)</span><br><span class="line">├── sender.html             # 发送端页面</span><br><span class="line">├── receiver.html           # 接收端页面</span><br><span class="line">├── css/</span><br><span class="line">│   └── styles.css          # 样式文件</span><br><span class="line">├── js/</span><br><span class="line">│   ├── config.js           # 配置常量</span><br><span class="line">│   ├── utils.js            # 通用工具函数 (SHA256, Base64, 分块等)</span><br><span class="line">│   ├── crypto.js           # 加密解密逻辑 (AES-GCM)</span><br><span class="line">│   ├── qrGenerator.js      # 二维码生成逻辑</span><br><span class="line">│   ├── qrScanner.js        # 二维码扫描逻辑</span><br><span class="line">│   ├── sender.js           # 发送端主逻辑</span><br><span class="line">│   ├── receiver.js         # 接收端主逻辑</span><br><span class="line">│   ├── storage.js          # IndexedDB 存储逻辑</span><br><span class="line">│   └── main.js             # 主入口，路由或初始化</span><br><span class="line">├── lib/</span><br><span class="line">│   ├── qrious.min.js       # 二维码生成库 (或 kjua)</span><br><span class="line">│   └── jsQR.js             # 二维码扫描库</span><br><span class="line">└── README.md               # 项目说明</span><br></pre></td></tr></table></figure><h2 id="成功…了吧？"><a href="#成功…了吧？" class="headerlink" title="成功…了吧？"></a>成功…了吧？</h2><p>在经过我连续的修改后，我这里直接搬出最终版本（2.0的）<br>二维码文件离线传输工具 (ECC)：基于 secp256r1 椭圆曲线加密，纯前端实现<br>本来我没想让AI走ECC这条路的，但是它中途就跟忘了似的，又沿用了我一开始的要求…<br>但最终效果还是不错的。<br><img alt="" src="data:image/png;base64,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s3+X/uMFa1d4c0qgBEqgBEqgBErgGQn0gvWMX71nLoESKIH7JNCtS+BuCPSCdTefqouWQAmUQAmUQAncC4HTLli+iSbtm2nyp7ofxHzr5qW6/pSf6s5b1c5Tp/xVv3ycl+ppfqqbn/ypbl7SnjflJ7/9zv+w/9u3F3tfdfJbT/o18/0f/e9rrz9P6/rViUeqm5f06xne/9H/vvb6s/Xd+5inft3h/R/rab/3va8/J3/Kt//WerrvK4O//Ul5qT7l4S6pP/mtp331Jz3dz/lq81Jd/y592gVr18LNKYESKIESKIESKIGrE+gFa/aF6i6BEiiBEiiBEiiBSKAXrIiohhIogRIogRK4OoHudzUCp12wfIMVhPXpm6n903znpbyUbz3pND/tY13tfOep9aunfvuTTvnW1dP8xGta17+637Tf8x/db756ysP+qXaeOvHR73z71VP/dJ759rtP0qnfuvPN1289afudpzbPutp8tXlq81LdfLX91tO8qd+8pNN+1s2zrnZ/6+bpT9q8s/RpF6yzDtQ5JVACJfAVAu0pgRIogZ0EesHaSbNZJVACJVACJVACJfAPgV6w/oHQ/+0g0IwSKIESKIESKIE3AqddsNIbqvW3BT/62zdX+6d155hn/Wg9na9fffS+Kd/voT/V9Sft+Xfnm+c8ddo31dM86+ZZn+5nv9p5SdvvPtbV5ls3L/mn/earnWddrT/ptK91dco/up7Ob9391dN9zU/9zlOn/tV6mnf2edI8901++divNk9t3suNfnHaBetG5+vYEiiBEiiBEiiBEjidQC9YpyPvwBIogRK4KwJdtgRK4AsEesH6ArS2lEAJlEAJlEAJlMDfCNzsgrX7zdQ3Wg+d6vqTNi+dx7raPPXUn/p3ny/Nc3/nWzdP/7Se8q2rnT/SnzCvzkv91hM//R7Bunlq/eqUr998+5M2T7/5U23e0dr9nOd51frVq373Uzsv1fWr7VfrT9rzq+1P81K/efpTvv36zVPbb908/Umbl7R5zlebZ928o/TNLlhHHai5JVACJVACJVACJXBrAvdwwbo1o84vgRIogRIogRIogRGBXrBGuGougRIogRIogTcC/bsEPiZw2gXLN9CkP175zxXfXHVZV0/3sd95STvPPLV+8/VbV5unTn7r6tU8z6OeztOfdNrf/qnf86R+/avz7U86zU/1lG9dHuo0T7/5SZuvtt+689Wp37r9zlOnfuv2q52v1r+av5pnvzrt5/n0Wzc/afvV9ltP+1g3z3rK169O+fpX55mX5qe6ebv0aResXQs3pwRK4HEI9CQlUAIl8KgEesF61C/bc5VACZRACZRACdyMQC9YN0O/Y3AzSqAESqAESqAErkjgZhcs30TVvtGqhTmtJ/9q/u5++ajTeVLdfZOe5ul3f+fpt550yp/2m5e0+yftPslv3f6p9jzTfvdZzUvznac/zbdfv3W181Jd/1S737Rf/3Rf56t356f9rO/Wnmeq3cf+xE+/etrvPuppnn7zfuz77h/TevKn+far36126I83u2AdeqqGl0AJlEAJlEAJlMANCfSCdUP4HV0CJVACHxDor0ugBO6cQC9Yd/4Bu34JlEAJlEAJlMD1CNzsgpXeRH1jFZ31pO3frVfn25/4rO7vvKSdN/Xb7/nUyW/9Nx1+4f7a0z761Slfv9r+pO13f7V+tX61fvfTr7b/aO1+6ul+9ic9PZ/7JJ3y3U+/+dO6fuel/NS/Wncfdcp3f/utm6fWb57+1bp5Sbuf2n73U0/9qd99kj/V3W+XvtkFa9cBmlMCJVACJVACJVACVyPw0QXrant2nxIogRIogRIogRK4GwK9YN3Np+qiJVACJVACLy9lUAL3QeC0C9bRb6C+ySb87qNO/c5Lepo/9bvvtN/9zUs69ad9rE+1+6V99E91yk/13fNSnjxX/Z5PnfL1q91XPc1P/tW6+6/med6kna9/uo959u+up7yjzzM9n/60XzqfefrVyW9dnfbVr0776E96d97q+dK+n62fdsH67EL1lUAJHEug6SVQAiVQAscT6AXreMadUAIlUAIlUAIl8GQEesEaf/A2lEAJlEAJlEAJlMDfCZx2wUpvrKn+92O8vKy+uTp/NS/1p7rndT/r6ql/uo/zVvvdV+28qTYv6Wl+8q/ymfYnf6rLJ/k9v/6k7U865Vn3PGrn2W9dPfXbn/ZJfuenPP1q56V6mmee2vyUl+op33rS7rfbn/Kse/6f+33//uP/W6hfbb/1pJ1nnnqaN/VP56X8XfXTLli7Fm5OCZRACZRACZRACVydQC9YV/9C3a8ESuAsAp1TAiVQAtsI9IK1DWWDSqAESqAESqAESuBfAje7YPmG++86//tnelO1nvT/kj/3k3l2re5vnvPU+le1+UmneT/6v317eftb/9vv3/62nnjqf8t5+9t+tf3Wk7Z/qt/2fPvbeea9+T77t/3qz+a8+dJ+5qvfct7+tr5bv815+9v8dB7rbzlvf5v39vvP/m2/Os13jv3WzUt++/UnnealfuenvFQ3L+npfsmf6u7vfqnfeup3ntp+685b1c5LOs07et80/6P6zS5YHy3U35dACZRACZRACZTATgK3yOoF6xbUO7MESqAESqAESuChCfSC9dCft4crgRIogR0EmlECJTAlcNoFK72RWk/ag+q3rvbN13rKs3/qn/a737Q/7WddPZ2f+s1Tp37r8lCbn+qrfvvVzvc8+lNdv/nWU5796tTvPHXKs26/errPqt9+tfupV8+X5pmvtl/tvlOd8lI9zVs9j/PVzrfufP3qab9+85JO+6W6+e6T+vWnPP1JO1/tvFvp0y5Ytzpg55bAFQh0hxIogRIogeci0AvWc33vnrYESqAESqAESuAEAndywTqBREeUQAmUQAmUQAmUwCYCN7tgpTfTVPeNVr/1pDfx/BmT5ln/2fjFHzx/inG+/Wr9aufZb12d/Kme9kl191Hbr3Y/62rz1frNT/7VuvPV5quT33o6n/lTPc13P+dN8+w337xUNy9p8/Q733rSq/3mm6fWr9afzm//SP9jdp76H8sv/5vuo1/9S/gG4f5qR7hP8ltXm2/declvv/6j9M0uWEcdqLklUAIlUAIlUAIlcGsCvWDd+gt0fgk8N4GevgRKoAQekkAvWA/5WXuoEiiBEiiBEiiBWxI47YLlG2h6Q01QVvPsd16q797/y/Nc/It693lcY5qfeKR6mpfqKd/zqe1XO9+6eWr7U918tf3Teton5af+tM/u/NV57pPOl+rmuV/q12/etF+/2ny1+0z7p/4037r5aV/95tlv3f7kT/2785yXtPPVqT/V5ZPyUz3N+2r9tAvWVxdsXwmUQAmUQAmUwP0RePaNe8F69n8Dev4SKIESKIESKIHtBHrB2o60gSVQAiWwg0AzSqAE7pnAZS5Y6U11Wtev9k12qs2b6vQvjfvot67WP93PvNTvvNRv3X61fvV0P/1pnnW1+ySd5qd8+9X2J536V+vOl4/51u3frZ2ndp51tX6157WuTvnm6Vebr576nZ/yzJ/2m2+/+fpTXf9u7b5n53t+tftZT/var7Z/mm9/ytd/lr7MBeusA3fO8xDoSUugBEqgBErgVgR6wboV+c4tgRIogRIogRJ4WAJ/uWA97Jl7sBIogRIogRIogRI4lMBpF6zpG6tvqqk/1aVovnW1fuclbd7Ub7/7qPWvzlvtd5+knTc9n/mpX796td+8qZ7O1y9P9XSf5He+2n73SX771Slvmp/81p3vfmr71frNV9uvNk+d/Kt157m/9d/maUDrn2riXqb7Jb/57mddnfxpvv3q1O8+SU/zpvuYr077HVU/7YJ11AGaWwIlUAIlUAIlUAJXI9AL1tW+SPcpgeMJdEIJlEAJlMDBBHrBOhhw40ugBEqgBEqgBJ6PwGkXLN9U1dM3U/vVKc+6/f6r8Iv/+/eX5E/91lOedfcxL9VX/dP+tI/1dF7raR/z1SnP/FXtfLX7WFev7mO/+Wr9U+357Hee2n61eUnbr7Z/tW6e57N+a+1+U514rZ7PfcxLdf1pX+vmWzc/afOSP80zL+lpXtrPuvOtq9M+1tXmnaVPu2CddaDOKYESKIESKIFnJdBzX4dAL1jX+RbdpARKoARKoARK4EEI9IL1IB+yxyiBEthBoBklUAIlsIfAzS5YvsGuvpmaJx7rzkt181a1882z7n76kzZPv/WkV/tTfjqv9ZSX9rWe9HSeefZbV+tX65ePdfunfvOSTvn2u591dcq3rt6dN81P50316f4pL+2f+q1P8/SrzZ+eP/mn81LetK5/et7kNz/paZ78Uv60nvKtT/ef7vOR/2YXrI8W6u/vm0C3L4ESKIESKIESeHnpBav/FpRACZRACZRACTw6gdPP1wvW6cg7sARKoARKoARK4NEJXPaC5RuqH8J6emO1vtrvPmrnWVe7j/WUl/rNSzrlre6T8t3LzFXlAAAQAElEQVTPeeqUl/yp333U9jtPrT/lTevOS/3Jb3/S6Xz2p/m76ynP/Va189SJl3X7k17d/0f/gf+Yns9VPL91tfOsT/OSP81LdfdLfuvul/R0nv6kp/PNs9/z6r+VvuwF61ZAOrcESqAESqAESqAEVgn0grVKsP0l8DkCdZVACZRACTwRgV6wnuhj96glUAIlUAIlUALnELjZBWv6hvrt27df/vt/4vENNuVbT3nm6095+tX2Hz3P+erpPrv7zUs89Kun/Z7fvFV9dL77OU+tXy2/pO1Xr/anPM83nZf6rbuP9en8lGc95Vu3331TPeXZP9XmJ53yPZ/a/t3zzF/V7q9ezbd/d758nbdan+bp36VvdsHadYDmlEAJlEAJlMAtCXR2CfyJQC9Yf6LS35VACZRACZRACZTAAoFesBbgtbUESmAHgWaUQAmUwOMROO2C5ZuqOr3x6vdT2J/89idtvn7nqVO/eWrz1OarzVObZz1p+9Xuo9af5lk3b1rX7z5q/Unbr3Z/dcpPdeep7Xd+0qnfutp890vafvPV+s1P/tW689Xmp/30J22eOu0zzU9+62n+at3zpvlpnv1q+9X61e6r1p/yU7956pSf6ua5j/2pbp791s/Sp12wzjrQM87pmUugBEqgBEqgBK5FoBesa32PblMCJVACJVACj0Lgqc/RC9ZTf/4evgRKoARKoARK4AgCl71gTd9Q0xttykv9wp/6U3/Kc3+1/Wrn26+2P9XNV5unNl9t3m49nef+033SPPPVzkv1NG+apz/pNN/99Se9Ot9891E7b1rXr/6Z/98PaT/r/7V9+NfUb9Bqv3nqxGPVb3/SaR/r6pQvz6TNc17S5utP+dan2vn2u4/+1brzjtKXvWAddeDmlkAJlEAJlEAJlMDRBHrBOppw829JoLNLoARKoARK4CYEesG6CfYOLYESKIESKIESeGQCf79gbTy5b6hq31Sno1PeND/507y0v/36na/Wr075+le189TmW0/nS/7Un+ppP+cnnealesq37v7mq/Wv6rTPND/ta32qp/sk/9nn3z0v5clXHvYnnfqtT7X7qs1z3+S3br/5avvV+tXTefaneUfX3Uedzpfq5qXz6N+lT7tg7Vq4OSVQAiVQAiVQAiVwdQK9YF39C3W/EiiBEiiBEiiBuyPQC9bdfbIuXAI7CDSjBEqgBErgSAI3u2D5Juqbaqonv9CmfvuTNl/teczTb11t3mp/ykt191O73+68aX7yu7/a/dX6pzrlpbrnS/NTnv3Jb13tfurpPPuTdh/1tN991Skv+d1P/1Sbl7T5yW/dfnlYP1o7332tJ532nebrN9/6dD/95quT37raPLV+z6e2X22eWv9R+mYXrKMOdFZu55RACZRACZRACZTARwR6wfqITH9fAiVQAiVQAvdHoBtfhEAvWBf5EF2jBEqgBEqgBErgcQhc9oI1fTPVr/aTWU96+gac5llfzTdvqj1/2me17rzpvs5Xm5fq+tX2u/+qNt/5audZV+tP2v60n/WUr995qd+6/Slf/y95375Z/uX/Rt9rtv7X303+/DaAX5hF+bd9kt99p9r59lufavc3X22+dbV+503r+tXOV+tP++hXp/4037rafOvTfcyz33x16jfvVvqyF6xbAencEiiBEiiBEiiBElgl0AvWKsH2S6C6BEqgBEqgBJ6eQC9YT/+vQAGUQAmUQAmUwDMQOPeMl7lg+aZ6tk7Y0xuw+5qX6uarzVObr9Zvvn7rSZuvNj/Vk99+97Oe9LTf/ZJ2vn7nq1O/dbXzrK9q953Om/rTvu6T/Kvznad2fpqX+s3Tr9aftPvtzpvOd59pf9o/1Z3nPkmnfuur2n1SXvLLJ/nTPOspz7r7TPP0H6Uvc8E66oDNLYESKIES2EOgKSVQAp8n0AvW51nVWQIlUAIlUAIlUAKfItAL1qcw1VQCOwg0owRKoARK4FkInHbB8g1VwOlNdbWe5rlf0mkf56lTvnX7k969X5rnvs5Xp7zkn9aT3/2n+6V88/Q7P2n71fZbdx+1frX+qU557m++dbV+tfPVKc960s5P2rxV/zRPHs6f5tm/qqfzkz/VV/e1X75J27+qp+fV777W03726zcv+e1Xm2f9KH3aBWvHAZpRAiVQAiVQAiVQAvdAoBese/hK3bEESqAESuDKBLpbCfxGoBes35D0FyVQAiVQAiVQAiWwRuC0C5ZvqGrfSK2nY6b+aV6al+ruk/yrdc+X5lu3X532m/rTfOvqtI9+9bRf/2pe6penetqf9jcvafcxP9XN//bt24s977X+1Xn2q9/Pfv3ZetKvPe//6H9f+9PPyW89aWfol2/S5iXtvKRX8+xP86Z189XmJZ761fanedN+81bnOX+q0z7up7ZfPd3nq/7TLlhfXbB9JVACJVACJVACJXBvBHrBurcv9ud9+9sSKIESKIESKIELEegF60Ifo6uUQAmUQAmUwGMReN7TnHbB8o00Idev9k1VrV/tfPutq82zf6rNV6c8/Wr3ndaT3/ykU571pJ2nX37Tun6189M8+9XmqVO+fvN369V59qvdd/f5nadO890n9ZuX/Knu/Gm+/pSn3/3U+tVpnnnJb77afrV+tftYT3o6L+VZN1/t/uqp3/lq81br5qnNv5U+7YJ1qwN2bgmUQAncM4HuXgIlcJ8EesG6z+/WrUugBEqgBEqgBC5MoBesC3+crraDQDNKoARKoARK4HwCp12w0hupdbVofDNWH93vPmr3SfW0r/3qNM98dcpbzXee2vlJu0/K02++9ZSX6uZPtflq86b725/y9TvPulr/dJ556pTvvOQ3337rKS/1m6dfrT9p+93Xfuup37p5qa5fvdpvnuezPp1n3mq/ee5n3XnW7devXvXbn/axnvQ0X/9ZOl6wzlqkc0qgBEqgBEqgBErgUQj0gvUoX7LnKIESKIHnItDTlsClCfSCdenP0+VKoARKoARKoATukcBpFyzfVIVlXT19IzZ/qp0/7V/dN/W7n361+6d+/eap9U/1NE+/53G+/tW688y37rykU79155v/R/+7//6fdfvVq/PMm2r3dR/rav3OT3X9R2v3d551tf7d53Oe+daTdl916rfuPmrz1Skv+VN9us/ReearpzzS+awnPZ3v/mfp0y5YZx2oc0qgBEqgBEqgBErg1gR6wfr6F2hnCZRACZRACZRACfyRQC9Yf8TSX5ZACZRACZTAvRLo3lcgcNoFyzfV9IY69ZsnXPNSXb/afuer9av1J21/0uYlfzpv6nfeVDtfneZbd771o7X7J726j+d13jTf/tV8+93HeUmnPPOnfvun2nnqlOf5k996mrean+aZr079aX/7k055qZ7yPZ/a/jQv9Vs3L2n3Sdp5ye98/dbV+p2f/PafpU+7YJ11oM4pgRIogVUC7S+BEiiBVQK9YK0SbH8JlEAJlEAJlEAJQKAXLIBU7iDQjBIogRIogRJ4bgKXuWClN1TfXP1sqa7/aD3dZ+p3/ym/3fN2zzcvac+jTrxSvv3m269/qs23P9X1u596mmd+0mlemm+/2v6pNk+dzuc8/dO689XmqZ2vNs+6eVP/tD/NN2+qU/60nniYp07765/OM9+8qV6dn/axrnbf6T6/+L9/N+4wfZkL1mEnbHAJlEAJlEAJlEAJnEygF6yTgXdcCZRACdwxga5eAiXwSQK9YH0SVG0lUAIlUAIlUAIl8FkCp12wdr+Bmpe0QKZvvObbr3ae2jzrSad5Kd960u6T5us33/qqTvnum7T7mK8278P+799fXnutq189kz/2J+2+zrI/1fWbb32qzVOnPPdXp37r9idtv9r+1fOZn/Kcn/rNs1+t33y1/at189TT/HQe89XOU5ufdMpP/c43z37rqT/VzVPb7z7W7U9++3fp0y5YuxZuTgmU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2rykzVdP8/Wr3We1Ps1Lfs+vtj/paf/Un+ZbT7z1u0/q12/eqjbffaynefYnf6pP89K+Kc9+/dbdP9X1m5/qye98tflJp37rab9UT/uk/rTPtN+8tN+u+s0uWLsO0JwS+AyBekqgBEqgBErgTAK9YJ1Ju7NKoARKoARKoASegsAnL1hPwaKHLIESKIESKIESKIEtBE67YPkG6huq9enpzFNP86b7OE+d5id/qpuf9rc+zdevdp9Vbb7afM9nXb3b737mq90n6dS/u+553C/NS/1H19N+qe55p3p6PvexP9Wn+yW/83f7U95f6/8U037y+qfll/+l+i/mT4iUl+pphOc1z7o65ZuX/Kme5qe6+6hTf6qn/b9aP+2C9dUF21cCJVACJVACJVAC90agF6x7+2LdtwT2EmhaCZRACZTAAQR6wToAaiNLoARKoARKoASem8BpF6z0Bprq6c3VetLO02/df01++t/99//e/y75zX/f+/qzdfOStv818/0f6ynvfe+ffk79qZ72+dPM978zP+Wlunnqs/udpz57P+er3ef9t3r9OfntV79mvP9jXe08tX61frV+9ftdX39O/dZfe97/SXXnJ//77D/9bJ56mm+/OuXpv7WWWdonnc+6OuW7jzr1p3nm6bee5qW6+VP/7n3S/Lf6aRest4H9uwRKoARKoARK4HgCnXBbAr1g3ZZ/p5dACZRACZRACTwggV6wHvCj9kglUAI7CDSjBEqgBL5O4LQLlm+g6q8f4d/O9EZr3fnW/0393z+TP/VbN+9/k/78k37z7Ep+60k7T+38pNM8685T63e+dbV5SZuftHnJv1r3fGrzraunfs+rNk/tfPVqnvNW89zPfPXU736p37ravKRTv+eb5tnvPOtTnfaxnvLTfinP/qnf/exX63e+dfU0b+p3H/undf2e5yx92gXrrAN1znUIdJMSKIESKIESeFYCvWA965fvuUugBEqgBErgOQmccupesE7B3CElUAIlUAIlUALPROAyFyzfTH2DTR/Ffv2pvts/ned57U9199dvPenV/rT/NN889zdv6jcv6ZRvf/JP9zdfbZ519dRvv9rzqpM/7WOeene/+e4/1e6X8lPdPLX7mZf0b/0f/N//e8vRr3Y/dfJbV6e8tz3f/p7261e/5b79bV395vvo73Qe89T2J/3RHm+/T/nW1c63/jbn7e/kX607f5e+zAVr14GaUwIlUAIlUAIlUAK3JtAL1q2/QOc/I4GeuQRKoARK4MEJ9IL14B+4xyuBEiiBEiiBEjifwGUuWOkN9Rc0fxD2T/UfIv/6q7e34be/0zzD9L/lvP1t3f6k33I++jvl2+c862rzrZunP9XNU6c88+23rjZfbV6q63eeWr9av/Otp/5UN1/tPHXyp7p5aV/90/zUP51vXtLTfZPfutp9Ut3zJ21+0uYlv3X3T3n61eZP9TQv7WtdPd1Pv/umfOvq1fzUb/0sfZkL1lkH7pwSKIESKIESOIpAc0vgjUAvWG8k+ncJlEAJlEAJlEAJbCLQC9YmkI0pgRLYQaAZJVACJfAYBE67YPlmKz7fZNX61fqn2rykPY/z7E/1aZ5+51lXu491tf40z/pUO9/+VNevTueZ+s2b7qdf7T6r2vyknaff86unfuepzZvW9avd37pav/up7VenvOSf1vUn7X7603mn9TTP+VO/+9ivdp796uS3nnTKt1+/51HrNy9p8/Sbr7Y/1c233/pZ+rQL1lkHevY5PX8JlEAJlEAJlMDtCfSCdftv0A1KoARKoARK4NEJPN35esF6uk/eA5dACZRACZRACRxN4GYXLN9Up1ow9ltP2jfbaV7yp/p0v7Sv9ZQ/rafzTOfrn+q0v/sm7fyUv7ue5k/3T3lpf+fpT3X9SbuvOvVbdz+1/qk2z32TTvN+9P/lv//n/JS36rdfneZb93zWk7Y/7aPffPvV9idtvtr+1Xn2O0+d/KluXtKeV536p/tM89P8z9ZvdsH67IL1lUAJlEAJlEAJlMC9EegF696+WPf9KoH2lUAJlEAJlMBpBHrBOg11B5VACZRACZRACTwLgc9fsDYTmb6JJn+qu356wzVPv3XzrauT33lq+6d6d146n/vpn+6T/OY7Xz3126+e5k39R89zH3Wa7/dJ/ebZb908/dbtT9q8pNO81G/d/ayrna/Wb75+tf6kU/9q3fnpfPqTTvul/lQ3P+1vPWnz1dP9kt99pn771eZ5HrX+lKd/l77ZBWvXAZpTAiVQAiXw3AR6+hK4IoFesK74VbpTCZRACZRACZTAXRPoBeuuP1+XL4EdBJpRAiVQAiWwm8DNLljpTTS9qQoi5emf5utP86yrp3nub960rv9onfZd5bG6f9rPfPe1rtbvvKRTnvWUZ33an85j3fypdl+1edbTPtan2vlq86yrp/vrV5vvPlO//eabp1712692P3Xyu6/91tXmq5PfefZP9XSefvdRu4/9av1TbZ7avLSv/l36ZhesXQe4Qk53KIESKIESKIESKIH3BHrBek+jP5dACZRACZTA4xDoSW5IoBesG8Lv6BIogRIogRIogcckcNkLlm+qaj+Hb6zJb/9UO0+d8tJ+07zkT/W0r/WUl85nXe08dZq/6ncftflT7f5T7by0X8o3T791dfKn/VKe+Umb53z7P/R/+/by2pvqr573f5LfuvuoV/32q9O892d7/Tn17857nfn+j/N367T/dF7Ks/7+rK8/W1e7z2vP+z/Jb7/+91mvP+tX229dnfyr9ded3/9x/lH6shesow7c3BIogRIogRIogRI4mkAvWEcTfu78nr4ESqAESqAEnpJAL1hP+dl76BIogRIogRJ4ZgLHn/20C5ZvqEmno9v//n319edUf/X87U+ab90s5+u3rtav1u98/dbtT9p+tfPUKT/5p/OS333SfOvmq1f99q/qtN9uHmlf90navORP5zFPPe1P/lR3vuezrl71p373T373sz/plG/dPOvuk7T96mm/fved1vUn7f5TPd3XfPczL/lT3fyp3/5d+rQL1q6Fm1MCJVACJXB7At2gBErg7wR6wfo7n1ZLoARKoARKoARKYEygF6wxsjaUwA4CzSiBEiiBEnhkAqddsHwTVa9C9k13mmd/2s966k9189Sex7r5+tX2p3rKN0+/defpT/XVPPPV5rtf0uZNtfOTdp80z7yj/e6nXp2f8lJ9ysN97VfrT/ukuvn61c5P2nz9V893v3Se6fnMt3+3dn+189xPnfzWnZe0/dP5U7/z1ClP/y592gVr18JvOf27BEqgBEqgBEqgBK5KoBesq36Z7lUCJVACJXCPBLpzCfwg0AvWDwz9RwmUQAmUQAmUQAnsI3DaBSu9gfqm6xHt16+2/9m0vDy/dflZt1+t3zz9u3Wal+rur7Zfnc5jnjr1T+sp3/r0PPrNc1/91n/p//79JWn7U36qO2/qd5+UZ/5UOy/1u4/aPLX5qZ780/60b5pnv361+6V+/avafZyvns5b7U/zpvme1/xp3tTvvF36tAvWroWbUwIlUAIlUAIlUAJXJ9AL1tW/0Hy/dpRACZRACZRACdyYQC9YN/4AHV8CJVACJVAC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" /><br>如上所示是我使用<strong>566eeadfaea7b2048cc9c46e18a7e379e5f2b2365fadef11336602f7aab45c85</strong>这个私钥生成的二维码，这个私钥是我第一次测试使用的，看起来如此亲切…<br>如果你扫码后，会发现一堆不知道怎么处理的数据，这个就是加密后的数据。<br>虽然我并没有藏什么彩蛋，如果你专门去处理的话，你会得到这个图片：<br><img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAA0CAYAAADVGFU3AAAABWZkRUNSJJPjAOWrYpkAAASFSURBVHgB5cRjtCVn2oDh+3mravPY57RtxLYzM0kGydi2bdu2EYxi22bbPH2szap6n2/Vj7PWXr06mWimZ773x3UxY8YMdVnCZLNZXJYwAP/N3vecI/jd257Pv5MBcFnClEol/pt98aLrOfebf+LfyQC4LGEAXJYwAC5LGACXJQyAyxIGwGUJA7C/vOq8l3Hh+1/GhS+fzxTg6JPP4sL3v4wL3388rwIAEjCTr73/ZVx43kwAnm0GYH8hAgDCKjuBW/vHAGB8lB0AwDNx+vFn8Jt3PpePdgPA4zEA+8umsQkA9oZaqgDAM9HR0Uw+ZQB4IgZgfysMDQHA2AQhABACAP8J5iNXbuIL12ziC3+/ieeddzwAe2Plxzj9Zw/yiSs38YVrNvGFK1fz/h9+h+52AHi6HhgcA2AS5ZAqwOgodwEAe8s39PDRl72AC9//Mi58/4v5zasP5qV5AEgcffJZXPj+l5F43jSAOg582cu48P0vY9KFb1zB0QA08NE3vgxT5wEAddM47I1f5eQjAGASp/2R93/9DRw9q4GMBwB4aZrnn8XL3vkGABK88XtcdtllPJELPnU8AJMKD9zIud/8E6+5dgwAdj/Ea775J869YAsAe6NxKd95/fEc2J0BADzybfN5wYsWcSAA8HSY775sNp94/nu4ZGMFaGfJCWcBkKDuY7zsXUfQDEysu4rffex5fOKU2XzidR/hd1dtYLgKAP8pNDTQxBiPXnYxb/zmn3jjr+9lZwS0zeHEdgC49dqLOfebfyJxyXaACe7/058495t/YtK5P3+IWwEY48s//xOmvx+YuJi77tsOgJ/pACDBK45ncQqizRfzg7e/lXX3PAYA2y9g3TdO5Vdf+AUACX7+Lp7znOfwRM773I0APF3YMe664FI+u2aCEWBkaB03b4kBQ+ADwNNhABL8/FQ+ccpsvvmpXwCQmNbTAcCme97DBACwP7HzUb6xEwAm9RVKADwTBuBfiUoA8ER44/e47LLLeCIXfOp4AP7bGIDH0z88CsD0Fe8H4P8rA/B4yndupB+oW/kG3v6VrzB7/hIAaD+e2e+6mtd94g0AJPj5u3jOc57DEznvczcC8J8yUYmBOpadMJ8T0wCwLwbg8XDHp/nbbf1Amu6DzuN1P7yEL1yziS/86Ve87nlzaU4BwH+rq9ZuJwSC7oN56ztexoXvfxmJC9+4gqMBgIQBeDywne2feRHf/OWNbBqqEAEAxGP0P3oxf/r+LwD4b1VYczvfvX4jfeNVAB6PAXgisJ3hv7yOX714EZ85ZTafOGU2nzh9Jd9973vY3Q8A/26whQ9980+ce8EWAGrdeu3FnPvNi/nybgDY210P3MXbf3YR537zT0w69+cPcSsAkDAALksYAJclDIDLEgbAZQkD4LKEAfhv9pHnH8eF738Z/04GwGUJA/Df7Ct/v4lzv/kn/p0MgMsSBsBlCQPgsoQBcFnCALgsYQBcljAALksYAJclDIDLEgbAZQkD4LKEAXBZwgC4LGEAXJYwAC5LGACXJQyAyxIGwGWJ/wMB+rnhW5WsEgAAAABJRU5ErkJggg==" /></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>不管怎么样，这个项目算是成型了，至于其他的内容，还需要我再去研究。<br>最后，附上文件（密码:9oag）：</p><a class="btn-anzhiyu " href="https://tabotef134.lanzoul.com/b0pn24rcj"   title="点击此处查看"><i class="anzhiyufont anzhiyu-icon-circle-arrow-right"></i><span>点击此处查看</span></a>]]></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;在今年2月份的时候，我有尝试使用二维码来离线传输图片，虽然这是一个不错的想法，但是在当时并没有取得成功（属于是一个差一点就成功）。&lt;br&gt;不</summary>
      
    
    
    
    <category term="科技" scheme="https://blog.jiyu134.top/categories/%E7%A7%91%E6%8A%80/"/>
    
    
    <category term="科技" scheme="https://blog.jiyu134.top/tags/%E7%A7%91%E6%8A%80/"/>
    
  </entry>
  
  <entry>
    <title>第一次去兽聚-绒萌世界</title>
    <link href="https://blog.jiyu134.top/posts/xmrm/"/>
    <id>https://blog.jiyu134.top/posts/xmrm/</id>
    <published>2025-07-16T05:46:48.598Z</published>
    <updated>2025-07-16T05:46:48.598Z</updated>
    
    <content type="html"><![CDATA[<div class="note success no-icon flat"><p>注：<br>1.拍摄+合影毛毛@冬灼（B站UID:1518141794）<br>2.本文章内所有图片均引用github仓库，因图片较大，加载可能会较慢。图片若有侵权，请联系我删除。<br>3.照片请见本文章结尾。请尽量不要使用流量进行加载。</p></div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>盼了100多天，从高考，到假期，终于把它盼来了！！！没错，就是绒萌世界。<br>这是我第一次迈出河北，走向外省，去看看新的天地，我十分激动。这次旅行，我打破了太多个“第一”了，第一次去兽聚，第一次坐火车，第一次坐地铁，第一次和我心爱的毛毛一起合影……不得不说，无论怎么样，这次的兽聚都让我很满意！<br><strong>我很愿意，和你一起分享我的旅行故事……</strong></p><h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><p>我十分期待这次的兽聚，说实在的，我已经记不得我为什么选择它了，应该是看着这场兽聚的人比较多，又考虑了时间吧。这个计划从高考前120天左右就开始筹划了（入群时间是今年3月1日），我当时看着倒计时的减少，十分激动。<br>家人也支持我去，正好去看看市面，也不失为一种成长的机会。（真是一举两得啊）这次旅行，我特意和我的姐姐一起去，不然实在是太无聊了。<br>出发前一天我准备好行李，原本计划是拿一个大包的，但想了想物料…还是拿上了行李箱，虽说有点沉吧。为了这次出发，我带了三套衣服，但是实际上就穿了一套…但问题不大。emm，是这样子的。<br>但是，十分不幸的是…我好像感冒了，又是流鼻涕，又是咳嗽的，十分难受。哎…</p><h2 id="出发"><a href="#出发" class="headerlink" title="出发"></a>出发</h2><div class="note blue anzhiyufont anzhiyu-icon-bullhorn disabled"><p>出发路程：<br>G664 从邢台东到石家庄 K371 从石家庄到常州<br>K234 从常州到邢台</p></div><p>在出发前几天需要强火车票，本来可以直接买K234火车的火车票，但是买票那天因为和一位大爷聊志愿填报的事情，导致我没有抢到，只能多花62元*2的价格坐了G664去石家庄，再从石家庄坐K371到常州。来回做了30h+，过夜两次，还是硬座…只能说，铁锭…<br>在火车上，我的位置是靠窗的，还可以看看沿途风景，还有个小桌子。<br>到常州还很有意思，还下雨，两天……我下了火车就坐着1号地铁去了民宿，一路上那雨…真是太不方便了。因为我到那里的时候已经11日中午快下午了，我中午也没吃饭，赶紧跑到活动酒店，去看看…</p><h2 id="第一天"><a href="#第一天" class="headerlink" title="第一天"></a>第一天</h2><p>我们的民宿距离酒店有点远，所以我们选择了打车，等我们进去后，我们领了官方物料，但是十分窘迫的事情发生了，因为我们两人已经带了一个包了，就导致我们新领的痛包不知道怎么放，最后我们只能把这些物料放到背包里。<br>我们先领完物料，再找附近的饭店吃了午饭，然后在赶回来…（好麻烦）<br>第一天我有点社恐，不好意思找其他毛毛合影，所以总共这么下来，也没拍几张图片，比较遗憾。<br>再加上出行疲惫，我们11日也就这样子了，不得已先回到民宿休息一天（我还想吐槽，为什么不提前一天到…）<br>但是不影响我还是要到了几只毛毛的合影（开心）</p><h2 id="第二天"><a href="#第二天" class="headerlink" title="第二天"></a>第二天</h2><p>第二天的活动相对要多一些，上午是自由活动时间，我去拍照和买东西。当时买了好多东西，但是没有地方寄存，我们只能手拎着东西，好累……<br>下午是官方表演时间和合照。不是我说，我感觉表演节目还是太少了，但是还是可以的啦。<br>其中有一个明日方舟的佩佩曲让我很兴奋，“掺冰冰！”<br>然后就是合照阶段，我当时还在楞，在想非毛毛可以拍吗？实际上没人管，我也拍上了，不告诉你们我在哪…（吐舌）<br>全体合照的时候有个毛毛看起来有点累，或许是热（真的，当时外面又热有湿，我一个人都汗流浃背了！我扶着他算是拍完了。不过由于我站的位置，前面的人说什么我是压根听不见啊…..<br>如果想看大合照的话，可以上B站找“绒萌视界”。<br>晚上有迪诺水镇的联动活动，但是我也没去成，本来到那里了，但是人太多，加之无聊，就先回到民宿了。<br>物料超多！！！！！<br><img src="https://random.jiyu134.top/WWF2.0/IMG_20250715_125433.jpg"><br><img src="https://random.jiyu134.top/WWF2.0/IMG_20250715_142314.jpg"><br><img src="https://random.jiyu134.top/WWF2.0/IMG_20250715_144345.jpg"></p><h2 id="第三天"><a href="#第三天" class="headerlink" title="第三天"></a>第三天</h2><p>到该结束的时间了，我去参加闭幕式了，我抽奖也就抽到一个画幅，实际录音可以点击下方。</p><div class="audio"><audio controls preload><source src='https://random.jiyu134.top/20250713_101317.mp3' type='audio/mp3'>Your browser does not support the audio tag.</audio></div><p>然后我们就去常州博物馆，环球港玩了玩。在环球港看了电影《名侦探柯南 独眼的残像》。最后我看了看森林公园。待了一会就回去睡觉了。</p><h2 id="第四天"><a href="#第四天" class="headerlink" title="第四天"></a>第四天</h2><p>我们中午吃了饭，然后就上了地铁，火车，在第五天早上回了家。真的好累…</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>不管怎么样，不管发生了什么，作为多个“第一次”，我觉得这次旅行弥足珍贵，这是我成年的第一次接触社会，是我成长的动力，我很期待下一次兽聚，也很期待能和你交朋友！<br>那么，下次见！</p><p>对了，想看图片可以点下面看哦~但请注意，请在WLAN的条件下打开，否则流量…你懂的。</p><details class="folding-tag" ><summary> 查看照片 </summary>              <div class='content'>              <div class="gallery">  <div class="fj-gallery page_img_lazyload lazyload btn_album_detail_lazyload data" data-rowHeight="220" data-limit="2">    <span class="gallery-data">[{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_102729.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_103131.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_104233.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_104309.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_105158.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_105853.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_110259.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_110640.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_111824.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_111926.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_112040.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_112449.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_112703.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_112935.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113030.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113135.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113214.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113447.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113508.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113518.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113606.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113623.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113813.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113906.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113912.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_113949.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_114025.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_114156.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_114333.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_114546.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_114744.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_114839.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_115107.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_115132.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_141454.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_154434.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_154854.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_163244.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_164056.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_165619.jpg","alt":""},{"url":"https://random.jiyu134.top/WWF2.0/IMG_20250712_171242.jpg","alt":""}]</span>  </div><button class="gallery-load-more" style="opacity:0">  <span>加载更多</span>  <i class="anzhiyufont anzhiyu-icon-arrow-down"></i>  </button></div>              </div>            </details>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;note success no-icon flat&quot;&gt;&lt;p&gt;注：&lt;br&gt;1.拍摄+合影毛毛@冬灼（B站UID:1518141794）&lt;br&gt;2.本文章内所有图片均引用github仓库，因图片较大，加载可能会较慢。图片若有侵权，请联系我删除。&lt;br&gt;3.照片</summary>
      
    
    
    
    
    <category term="生活" scheme="https://blog.jiyu134.top/tags/%E7%94%9F%E6%B4%BB/"/>
    
  </entry>
  
  <entry>
    <title>高考结束啦！（持续更新）</title>
    <link href="https://blog.jiyu134.top/posts/gkzhuanban/"/>
    <id>https://blog.jiyu134.top/posts/gkzhuanban/</id>
    <published>2025-06-11T01:43:44.753Z</published>
    <updated>2025-06-11T01:43:44.753Z</updated>
    
    <content type="html"><![CDATA[<p>啊啊啊啊！高考终于结束了（虽然是前天结束的吧…），终于有时间来回归我的吃灰博客了。<br>首先我得向向我申请友链的兄弟说声对不起，没有及时添加是我的错！（跪），很抱歉…<br>然后…进入正题！</p><h2 id="高考，我都发生了什么？"><a href="#高考，我都发生了什么？" class="headerlink" title="高考，我都发生了什么？"></a>高考，我都发生了什么？</h2><div class="note success no-icon flat"><p>注：本人是河北考生，选科组合为物化地，用的新高考一卷和河北卷。</p></div><p>今年我高考，其实我还算有点紧张。</p><u>一方面是温度</u>，这几天中午的温度确实有点高，但是！我是校外考，而且在另一个校区，所以我可以坐学校的校车去，校车还有空调，不算热啦。看着外面一群送行的家长和护航的交警，心里确实有点紧张，热，大概率是内心焦虑吧。<p>我们是考试前一天去食堂学习，虽然也学不下去吧（*小声，是这个样子的），但是算有点用，心理上？<br>不得不说，食堂的空调直吹我，头顶上还有个电扇，呼呼直吹，真的好凉。</p><u>然后另一方面自然是题目了</u>。当我到达考点的时候，前面围了一群家长，但是我还是顺利的进去了。先是进封闭区域，再是进考场...一切都还好。<p>考<mark class="hl-label red">语文</mark> 的时候我全身都在发抖，我看到题目的时候给我吓一跳，上来的阅读就是有点文言的东西，我又紧张，一点也看不下去。那个时候还没让答题，我就已经有点慌了，尤其是选择，怎么还能把我的第三题改成填空嘞！我那时候赶紧调好心态，向下翻了翻。啊！一看到默写，这下子是真凉了，平时我背诵就很不好，一看这玩意，完全不知道该怎么下手…只好再往下看看，看到语言文字运用，我笑了。<br>考前我们老师还说这次一定会考字形，但这回偏偏没有，甚至连我最不喜欢的成语都给我改成了选择（不会是出卷人认为前面的题目难吧…）。<br>最后就是<emp>作文</emp>…依托答辩。我感觉我好像写偏了，但也许没有。我已经忘记我写的题目具体是什么了，只记得有“力量”“汗水”，但我想到我联系了国家，民族，所以我觉得没跑偏…也许吧。</p><div class="note blue anzhiyufont anzhiyu-icon-bullhorn disabled"><p><em>另附作文材料内容：</em><br>他想要给孩子们唱上一段，可是心里直翻腾，开不了口。<br>——老舍《鼓书艺人》（见全国一卷阅读 II）<br>假如我是一只鸟，我也应该用嘶哑的喉咙歌唱<br>——艾青《我爱这土地》<br>我要以带血的手和你们一一拥抱，因为一个民族已经起来<br>——穆旦《赞美》<br>以上材料引发了你怎样的联想和思考？请写一篇文章。<br>要求：选准角度，确定立意，明确文体，自拟标题；不要套作，不得抄袭；不得泄露个人信息；不少于 800 字。</p></div><span class='p red center small'>but！！！这回语文，我写完全卷的时候距离考试结束还有45分钟！！！啊啊啊啊啊啊啊啊啊啊</span><mark class="hl-label red">数学</mark> 啊，那更是一坨。看到这张卷，我一下乐了，前面的题目看着好简单，事实上确实是这个样子的。选择（单选+多选）一共就扣了2分。填空...我把“-2”漏了！痛失5分...大题，啊啊啊，卡方算错了，多了一个“0”，不知道评卷老师会怎么搞。我是列数字那一地方没错，结果多了个零（就是1000看错成10000了），后面的圆锥曲线那是一点分也没有，上来就错了。 <wavy>哎...我不能保证数学所有错误我都能在考试的时候知道...错就错了。</wavy><p>至于<mark class="hl-label green">英语</mark> …emm，这是个好问题。我当时考试真的很认真，尤其是听力，几乎全是圈（在画关键词），写的选项字母也十分漂移<mark class="hl-label blue">（不止这一科，所有科都是）</mark> ，唯一这张试卷好笑的地方，阅读A篇之CCB。<br>完形填空太难了！要我说，那个玻璃花瓶咱就必须卖吗？<br>作文还行，二选一，我没见过的形式，想套模版有点难，不过还可以。大作文材料自个找吧。<br>我选的是“Guess who I am”</p><div class="note blue anzhiyufont anzhiyu-icon-bullhorn disabled"><p><em>另附作文材料内容：</em><br>假定你是李华，你班的英语报要增设一个栏目。外教 Jenny 提出“Fun at myschool”和“Guess who I am”两个选项供大家选择。请给 Jenny写一封邮件,内容包括:<br>(1)你的选择；<br>(2)说明理由。<br>注意：<br>(1)写作词数应为80个左右；<br>(2)请按如下格式在答题卡的相应位置作答。<br>Dear Jenny,<br>I really like the idea of adding a new column to our English newspaper.</p><p><span class='p right'>Yours Li Hua</span></p></div><p>然后<mark class="hl-label green">物理，化学，地理</mark> ，我的印象不是很深刻了，但我知道它们也不简单QAQ<br>物理结束的时候，我们要返校。等我回到食堂的时候，我看到打饭那里没人，我登的一下窜到打饭窗口，跟大爷说我要打饭。他犹豫了一下，看着旁边教师窗口，给我打了一碗米饭。<br>但当看到碗里的一张饭票和背后都在学习的学生，我心里咯噔一下，但没想太多，我在食堂一楼走了四分之一圈，又上楼走了半圈回到自己的座位。有人说你在干啥，为什么不直接回到座位…当时我在找筷子（因为饭还没到点）（笑）。<br>最后广播在那里喊说还没到点呐，别吵了。我心里又咯噔一下，“坏了！”，但好在广播没说我，我也没被抓到，但看我桌上的大米饭，我又看看要走过来的班主任…我赶紧把它藏到了桌下….<br>当别人还在吃刚出锅，特别烫的米饭时，我早就吃完了。<br><strong>那是我吃到的最好吃的米饭！</strong></p><span class='p center red small'>所以综上，依托答辩。</span><h2 id="高考成绩"><a href="#高考成绩" class="headerlink" title="高考成绩"></a>高考成绩</h2><p>注：<br>1.名次排名仅算河北省内考生（共计<strong>363040</strong>人,物理类）。<br>2.请勿过分讨论考试分数高&#x2F;低。本人语文水平不高，但考的已经很满意了。<br>3.物理科目特控线499分，本科批459分、专科批200分。</p><table><thead><tr><th>项目</th><th>分数&#x2F;名次</th></tr></thead><tbody><tr><td><strong>总分</strong></td><td><strong>568</strong></td></tr><tr><td><strong>排名</strong></td><td><strong>58000</strong></td></tr><tr><td>语文</td><td><strong>103</strong></td></tr><tr><td>数学</td><td><strong>112</strong></td></tr><tr><td>英语</td><td><strong>116</strong></td></tr><tr><td>物理</td><td><strong>78</strong></td></tr><tr><td>化学</td><td><strong>79</strong></td></tr><tr><td>地理</td><td><strong>80</strong></td></tr></tbody></table><div class="note success no-icon flat"><p>成绩出来那晚，我真的很高兴，因为这次成绩真的可以算是我高中以来最好成绩。成功超特控线<strong>69</strong>分。<br>但是今年的分数线涨了，其实我也很害怕，自我感觉一本有些够呛（如果兼顾专业）。<br>我一开始想学计算机科学与技术，但还是准备选其他的来替代，例如自动化，电气工程及其自动化等。</p></div><h2 id="高考录取！"><a href="#高考录取！" class="headerlink" title="高考录取！"></a>高考录取！</h2><p>等待了好长时间，我的录取结果终于是出来了！<br><strong>我被井冈山大学的电气工程及其自动化专业录取了</strong><br>这是我的录取通知书：<br><img src="https://img.z4a.net/images/2025/07/29/IMG_20250726_110751.jpeg" alt="通知书"><br>录取结果出来的那一天，我很激动，真的是，难以用语言形容。<br>虽然有点远，但也还好。<br>要说怎么录取到这个地方…唔…这个是因为我们先按照分数和专业的原则排个序，再按照学校的位置删掉太远的（比如新疆西藏这些）地方，最后根据宿舍情况等其他原因确定好了志愿表。<br>本来省外给河北的名额就少，我们本不打算能录取到省外，猜的话也是在河北本地上个大学，但是……<br>这不是录上省外了吗！<br>emm…<br>挺好的~</p><h2 id="结束语"><a href="#结束语" class="headerlink" title="结束语"></a>结束语</h2><p>所以，至此，这篇文章到此就结束了，高中生活已经结束了！<br>我也将继续学习，争取更上一层楼，冲一冲！<br>(但愿未来的我不要看着这篇文章流泪)（应该不会吧）<br>-2025年7月29日</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;啊啊啊啊！高考终于结束了（虽然是前天结束的吧…），终于有时间来回归我的吃灰博客了。&lt;br&gt;首先我得向向我申请友链的兄弟说声对不起，没有及时添加是我的错！（跪），很抱歉…&lt;br&gt;然后…进入正题！&lt;/p&gt;
&lt;h2 id=&quot;高考，我都发生了什么？&quot;&gt;&lt;a href=&quot;#高考，我都</summary>
      
    
    
    
    
    <category term="生活" scheme="https://blog.jiyu134.top/tags/%E7%94%9F%E6%B4%BB/"/>
    
  </entry>
  
  <entry>
    <title>二维码离线传输图片（有点失败</title>
    <link href="https://blog.jiyu134.top/posts/dwej/"/>
    <id>https://blog.jiyu134.top/posts/dwej/</id>
    <published>2025-02-10T07:57:40.296Z</published>
    <updated>2025-02-10T07:57:40.296Z</updated>
    
    <content type="html"><![CDATA[<div class="note info simple"><p>info 本文章代码均为AI生成，请注意仔细甄别！<br>使用模型：海螺AI，deepseek R1；Qwen2.5-Max</p></div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>近期，DeepSeek的热度颇高，我也萌生了借助它开发项目的想法。<br>此前，我曾关注过一位B站UP主（链接见下）分享的通过二维码传输图片或文件的代码，便计划复刻类似功能。由于自身编程能力有限，我决定尝试通过AI辅助完成这一项目。</p><div calss='anzhiyu-tag-link'><a class="tag-Link" target="_blank" href="https://www.bilibili.com/video/BV1W5FCepEmV">    <div class="tag-link-tips">引用站外地址</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="">          <i class="anzhiyufont anzhiyu-icon-link" style=""></i>        </div>        <div class="tag-link-right">            <div class="tag-link-title">qrs - 用空气传输文件 · 续</div>            <div class="tag-link-sitename"> https://www.bilibili.com/video/BV1W5FCepEmV </div>        </div>        <i class="anzhiyufont anzhiyu-icon-angle-right"></i>    </div>    </a></div><div calss='anzhiyu-tag-link'><a class="tag-Link" target="_blank" href="https://qrss.netlify.app/">    <div class="tag-link-tips">引用站外地址</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="">          <i class="anzhiyufont anzhiyu-icon-link" style=""></i>        </div>        <div class="tag-link-right">            <div class="tag-link-title">qrs 传输</div>            <div class="tag-link-sitename"> https://qrss.netlify.app/ </div>        </div>        <i class="anzhiyufont anzhiyu-icon-angle-right"></i>    </div>    </a></div><p>我初期使用了deepseek推出的R1模型，通过对我所述的进行编程，但是…这个…它现在被攻击，服务器十分不稳定，处于第一句可以答但第二句就“服务器繁忙，请稍后重试”的状态…所以我只能先退一步，让“海螺AI”生成这个代码。</p><div calss='anzhiyu-tag-link'><a class="tag-Link" target="_blank" href="https://hailuoai.com/">    <div class="tag-link-tips">引用站外地址</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="">          <i class="anzhiyufont anzhiyu-icon-link" style=""></i>        </div>        <div class="tag-link-right">            <div class="tag-link-title">海螺AI</div>            <div class="tag-link-sitename"> https://hailuoai.com/ </div>        </div>        <i class="anzhiyufont anzhiyu-icon-angle-right"></i>    </div>    </a></div><p>如下是我写的大纲，基本思路是对的。</p><details class="folding-tag" cyan open><summary> 查看大纲 </summary>              <div class='content'>              <p>##工作原理</p><p>输出端用户上传文件，网站拆分内容为X份，将内容放入二维码，通过屏幕展示出来，输入端用户进行扫描，将若干二维码合并成原内容，形成文件。</p><h2 id="具体实现步骤"><a href="#具体实现步骤" class="headerlink" title="具体实现步骤"></a>具体实现步骤</h2><p>这里需提前说明，X的值取决于用户选择输出多大（Z）的二维码以及转化后的内容大小。M的值需要用户输入。<br>文件不限格式，但如果是图片和txt文件需要格外注意。</p><h1 id="输出端步骤"><a href="#输出端步骤" class="headerlink" title="输出端步骤"></a>输出端步骤</h1><ol><li>   输出端用户需要上传文件，可上传多个文件（最多25个），网站先对源文件分析得到SHA-256，大小。</li><li>   网站将文件转换成Base64代码 ，连同，文件名称，大小，类型一起（这三个放在代码最前面），将它们合理拆分，得到X个组块。但请注意，拆分后需要再每个组块后面都加入英文半角符号“-” 和字母（如果是多个文件，按照文件大小排序由A到Y）和数字Y（用于判断拆分顺序）（1到X）。例如A1,A2,A3,B1,B2,C1,C2,C3,C4。再加入SHA-256，最后加入“-”和组块数量X。</li><li>   每个组块需要加密，采用椭圆曲线加密（ECC）（这里使用椭圆曲线 secp256r1）的形式。<br>其中：<br>a.程序内包含有25个私钥，25个临时私钥。（内容已附在Excel，一一对应。）<br>b.根据ECC的规则，将临时公钥随机地放置在每个组块开头（在临时公钥后加上英文半角符号“-”）以供识别。<br>c.加密的时候除了临时公钥和第一个“-”不要加密，其他的均需要加密。<br>现在，举个例子。（还没有加密）（这里以文件处理后只有一个组块为例）<br>030c6208f6b0bf5641766b61e0bea555cd8ef5ab8b9e94f5cb79957096eebffb9c-Y2VzaGkxMjNoYWhh-A1-C6322C7382AA4329A29347AEF4D72EF85FD48B77896820AB9C3F51450B28C2BA-1<br>其中，“030c6208f6b0bf5641766b61e0bea555cd8ef5ab8b9e94f5cb79957096eebffb9c”是临时公钥（这个不要加密），“Y2VzaGkxMjNoYWhh”是Base64值，“A1”对应“字母和数字Y”，“C6322C7382AA4329A29347AEF4D72EF85FD48B77896820AB9C3F51450B28C2BA”对应源文件SHA256值，“1”对应组块数量为1。英文半角符号“-”不可省略。</li><li>   需要将这X组块塞到X个大小为Z*Z的二维码中。 输出端需要将X个二维码以幻灯片的形式每秒M个二维码的速度快速显示在网页中央，便于输入端扫描。</li></ol><h1 id="输出端步骤-1"><a href="#输出端步骤-1" class="headerlink" title="输出端步骤"></a>输出端步骤</h1><ol><li>   输入端需要调用摄像头权限，不断扫描输出端的二维码直到所有内容均已被扫描识别。输入端需要将已扫描和未扫描的二维码编号放在扫描摄像头窗口的下面，便于用户判断。</li><li>   输入端的扫描摄像头应标识扫描进度以及扫描速度（以Kb&#x2F;s的形式展现）。</li><li>   获取到每个二维码后采用ECC的解密方法将原来的加密内容进行解密，再由顺序拼回去，再由Base64得到源文件。<br>其中需要注意的地方有以下几点<br>a.解密时源文件Base64内容只是第一个“-”到第二个“-”之间的数据，其他的仅供程序判断。<br>b.程序需要根据临时公钥和私钥计算共享密钥，恢复消息点，解码。<br>c.解密时不要连带临时秘钥一起解密，只有第一个“-”之后（不含）的需要解密。</li><li>   扫描结束后应提示用户是否储存（在此之前应存入缓存中）。</li></ol>              </div>            </details><h2 id="第一次尝试"><a href="#第一次尝试" class="headerlink" title="第一次尝试"></a>第一次尝试</h2><u>可能有表述不清楚的地方，不过也就那样了，能理解就可以吧（我觉得应该...没问题，如果硬要质疑的话请往下看）</u><p>我采用了python+浏览器的形式来处理这个问题，不过…好像和他的差了好多…<br>然后这是它生成的最终代码（只有输出端）</p><details class="folding-tag" ><summary> 代码 </summary>              <div class='content'>              <figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> cryptography.hazmat.primitives.asymmetric <span class="keyword">import</span> ec</span><br><span class="line"><span class="keyword">from</span> cryptography.hazmat.primitives <span class="keyword">import</span> serialization</span><br><span class="line"><span class="keyword">import</span> binascii</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">generate_public_key</span>(<span class="params">private_key_hex: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    根据给定的私钥（十六进制字符串）生成对应的公钥（压缩格式的十六进制字符串）。</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    :param private_key_hex: 私钥，十六进制字符串</span></span><br><span class="line"><span class="string">    :return: 公钥，压缩格式的十六进制字符串或错误信息</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># 将十六进制字符串转换为字节</span></span><br><span class="line">        private_key_bytes = binascii.unhexlify(private_key_hex)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 加载私钥</span></span><br><span class="line">        private_key = ec.derive_private_key(</span><br><span class="line">            <span class="built_in">int</span>.from_bytes(private_key_bytes, byteorder=<span class="string">&#x27;big&#x27;</span>),</span><br><span class="line">            ec.SECP256R1()</span><br><span class="line">        )</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 获取公钥</span></span><br><span class="line">        public_key = private_key.public_key()</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 序列化公钥为压缩格式（X9.62格式）</span></span><br><span class="line">        public_key_bytes = public_key.public_bytes(</span><br><span class="line">            encoding=serialization.Encoding.X962,</span><br><span class="line">            <span class="built_in">format</span>=serialization.PublicFormat.CompressedPoint</span><br><span class="line">        )</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 将公钥转换为十六进制字符串</span></span><br><span class="line">        public_key_hex = binascii.hexlify(public_key_bytes).decode()</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">return</span> public_key_hex</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="keyword">return</span> <span class="string">f&quot;Error: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">batch_convert</span>(<span class="params">source_path: <span class="built_in">str</span>, target_path: <span class="built_in">str</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    批量转换私钥为公钥。</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">    :param source_path: 源TXT文件路径</span></span><br><span class="line"><span class="string">    :param target_path: 目标TXT文件路径</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(source_path, <span class="string">&#x27;r&#x27;</span>) <span class="keyword">as</span> src_file, <span class="built_in">open</span>(target_path, <span class="string">&#x27;w&#x27;</span>) <span class="keyword">as</span> tgt_file:</span><br><span class="line">            line_num = <span class="number">0</span></span><br><span class="line">            <span class="keyword">for</span> line <span class="keyword">in</span> src_file:</span><br><span class="line">                line_num += <span class="number">1</span></span><br><span class="line">                <span class="comment"># 去除空白字符</span></span><br><span class="line">                private_key = line.strip()</span><br><span class="line">                </span><br><span class="line">                <span class="comment"># 验证私钥长度</span></span><br><span class="line">                <span class="keyword">if</span> <span class="built_in">len</span>(private_key) != <span class="number">64</span>:</span><br><span class="line">                    error_msg = <span class="string">f&quot;Line <span class="subst">&#123;line_num&#125;</span>: 私钥长度应为64个十六进制字符（256位）。&quot;</span></span><br><span class="line">                    tgt_file.write(<span class="string">f&quot;<span class="subst">&#123;error_msg&#125;</span>\n&quot;</span>)</span><br><span class="line">                    <span class="keyword">continue</span></span><br><span class="line">                </span><br><span class="line">                <span class="comment"># 生成公钥</span></span><br><span class="line">                public_key = generate_public_key(private_key)</span><br><span class="line">                </span><br><span class="line">                <span class="comment"># 写入目标文件</span></span><br><span class="line">                tgt_file.write(<span class="string">f&quot;<span class="subst">&#123;public_key&#125;</span>\n&quot;</span>)</span><br><span class="line">        </span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;转换完成。输出文件位于：<span class="subst">&#123;target_path&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> FileNotFoundError:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;错误：文件未找到。请检查路径：<span class="subst">&#123;source_path&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;发生错误：<span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;ECC公钥批量转换器（基于secp256r1）&quot;</span>)</span><br><span class="line">    source_path = <span class="built_in">input</span>(<span class="string">&quot;请输入源TXT文件的本地路径（例如：C:/keys/source.txt）：\n&quot;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 检查文件是否存在</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(source_path):</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;错误：文件不存在。请检查路径：<span class="subst">&#123;source_path&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 生成目标文件路径</span></span><br><span class="line">    directory, filename = os.path.split(source_path)</span><br><span class="line">    filename_no_ext, ext = os.path.splitext(filename)</span><br><span class="line">    target_filename = <span class="string">f&quot;<span class="subst">&#123;filename_no_ext&#125;</span>_public_keys<span class="subst">&#123;ext&#125;</span>&quot;</span></span><br><span class="line">    target_path = os.path.join(directory, target_filename)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 开始转换</span></span><br><span class="line">    batch_convert(source_path, target_path)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br><span class="line"></span><br></pre></td></tr></table></figure>              </div>            </details><h2 id="第二次尝试"><a href="#第二次尝试" class="headerlink" title="第二次尝试"></a>第二次尝试</h2><p>虽然有那么点意思，但是还是有点不尽人意…于是我就暂置了几天（4天），直到通义千问Qwen的出现，算是救了一场。</p><div calss='anzhiyu-tag-link'><a class="tag-Link" target="_blank" href="https://chat.qwenlm.ai/">    <div class="tag-link-tips">引用站外地址</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="">          <i class="anzhiyufont anzhiyu-icon-link" style=""></i>        </div>        <div class="tag-link-right">            <div class="tag-link-title">通义千问Qwen版本</div>            <div class="tag-link-sitename"> https://chat.qwenlm.ai/ </div>        </div>        <i class="anzhiyufont anzhiyu-icon-angle-right"></i>    </div>    </a></div><p>听说这个好用，我就试了试（免费哈）（目前），发现确实有意思！我让它生成了代码，响应迅速，很不错（没有打广告，实事求是而已…）。我通过一步一步引导它，没想到还真就像模像样的搞出来一个版本出来，具体如下。<br>首先是它的框架：<br>project&#x2F;<br>├── app.py<br>├── key.xlsx<br>├── templates&#x2F;<br>│   └── index.html<br>├── static&#x2F;<br>│   └── qrs&#x2F;<br>其中，这个“app.py”作为主代码，集成了输入和输出端，可以供用户选择功能。key.xlsx是存放私钥和公钥的地方（含临时），有意思的是，这个东西我没有选择隐藏加密（我不会…）。qrs是存放二维码的地方。index.html使用了浏览器，用于上传和展示二维码。<br>下面是源码（最后会给你，不用复制了）：</p><details class="folding-tag" ><summary> 源码 </summary>              <div class='content'>              <figure class="highlight python"><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><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> shutil</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">import</span> hashlib</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">from</span> Cryptodome.PublicKey <span class="keyword">import</span> ECC</span><br><span class="line"><span class="keyword">from</span> Cryptodome.Cipher <span class="keyword">import</span> AES</span><br><span class="line"><span class="keyword">from</span> Cryptodome.Util.Padding <span class="keyword">import</span> pad, unpad</span><br><span class="line"><span class="keyword">import</span> qrcode</span><br><span class="line"><span class="keyword">import</span> io</span><br><span class="line"><span class="keyword">import</span> cv2</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> Flask, request, jsonify, render_template_string, send_from_directory</span><br><span class="line"></span><br><span class="line"><span class="comment"># ============================== 配置根目录 ==============================</span></span><br><span class="line">ROOT_DIR = <span class="string">r&quot;C:\Users\lenovo\Documents\qrs&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 确保根目录及其子目录存在</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">ensure_root_directory</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    确保根目录及其子目录存在。</span></span><br><span class="line"><span class="string">    如果不存在，则创建它们。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(ROOT_DIR):</span><br><span class="line">        os.makedirs(ROOT_DIR)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;已创建根目录: <span class="subst">&#123;ROOT_DIR&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 确保子目录存在</span></span><br><span class="line">    subdirs = [<span class="string">&quot;uploads&quot;</span>, <span class="string">&quot;qrs&quot;</span>, <span class="string">&quot;templates&quot;</span>, <span class="string">&quot;static&quot;</span>]</span><br><span class="line">    <span class="keyword">for</span> subdir <span class="keyword">in</span> subdirs:</span><br><span class="line">        subdir_path = os.path.join(ROOT_DIR, subdir)</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(subdir_path):</span><br><span class="line">            os.makedirs(subdir_path)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;已创建子目录: <span class="subst">&#123;subdir_path&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取资源文件的路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">resource_path</span>(<span class="params">relative_path</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    动态获取资源文件的路径。</span></span><br><span class="line"><span class="string">    - 在开发环境中，返回相对路径。</span></span><br><span class="line"><span class="string">    - 在打包后的环境中，返回 PyInstaller 解压路径。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">hasattr</span>(sys, <span class="string">&#x27;_MEIPASS&#x27;</span>):</span><br><span class="line">        <span class="keyword">return</span> os.path.join(sys._MEIPASS, relative_path)</span><br><span class="line">    <span class="keyword">return</span> os.path.join(os.path.abspath(<span class="string">&quot;.&quot;</span>), relative_path)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 解压依赖文件到目标目录</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">extract_dependencies</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    将依赖文件解压到目标目录。</span></span><br><span class="line"><span class="string">    如果文件已存在，则不会重复解压。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    dependencies = &#123;</span><br><span class="line">        <span class="string">&quot;key.xlsx&quot;</span>: os.path.join(ROOT_DIR, <span class="string">&quot;key.xlsx&quot;</span>),</span><br><span class="line">        <span class="string">&quot;templates/index.html&quot;</span>: os.path.join(ROOT_DIR, <span class="string">&quot;templates/index.html&quot;</span>),</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> src, dst <span class="keyword">in</span> dependencies.items():</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(dst):</span><br><span class="line">            src_path = resource_path(src)</span><br><span class="line">            shutil.copy(src_path, dst)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;已解压文件: <span class="subst">&#123;src&#125;</span> -&gt; <span class="subst">&#123;dst&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 初始化根目录和依赖文件</span></span><br><span class="line">ensure_root_directory()</span><br><span class="line">extract_dependencies()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例：加载 key.xlsx 文件</span></span><br><span class="line">key_excel_path = os.path.join(ROOT_DIR, <span class="string">&quot;key.xlsx&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例：加载模板文件</span></span><br><span class="line">template_html_path = os.path.join(ROOT_DIR, <span class="string">&quot;templates/index.html&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 初始化 Flask 应用</span></span><br><span class="line">app = Flask(__name__, static_folder=resource_path(<span class="string">&quot;static&quot;</span>))</span><br><span class="line"></span><br><span class="line"><span class="comment"># ============================== 公共函数 ==============================</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">load_keys_from_excel</span>(<span class="params">file_path</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    从 Excel 文件中加载私钥和临时私钥。</span></span><br><span class="line"><span class="string">    返回两个列表：私钥和临时私钥。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(file_path):</span><br><span class="line">        <span class="keyword">raise</span> FileNotFoundError(<span class="string">&quot;Excel file not found&quot;</span>)</span><br><span class="line">    df = pd.read_excel(file_path)</span><br><span class="line">    private_keys = df[<span class="string">&#x27;私钥d&#x27;</span>].tolist()</span><br><span class="line">    temp_private_keys = df[<span class="string">&#x27;临时私钥r&#x27;</span>].tolist()</span><br><span class="line">    <span class="keyword">return</span> private_keys, temp_private_keys</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">encrypt_data_aes</span>(<span class="params">data, shared_key</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    使用 AES 对称加密加密数据。</span></span><br><span class="line"><span class="string">    返回加密后的数据（IV + 密文）。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    key = shared_key[:<span class="number">32</span>]  <span class="comment"># 截取32字节作为AES密钥</span></span><br><span class="line">    cipher = AES.new(key, AES.MODE_CBC)</span><br><span class="line">    ct_bytes = cipher.encrypt(pad(data.encode(<span class="string">&#x27;utf-8&#x27;</span>), AES.block_size))</span><br><span class="line">    iv = cipher.iv</span><br><span class="line">    <span class="keyword">return</span> iv.<span class="built_in">hex</span>() + ct_bytes.<span class="built_in">hex</span>()  <span class="comment"># 返回IV和加密数据的十六进制表示</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">decrypt_data_aes</span>(<span class="params">encrypted_data, shared_key</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    使用 AES 对称加密解密数据。</span></span><br><span class="line"><span class="string">    返回解密后的原始数据。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    key = shared_key[:<span class="number">32</span>]  <span class="comment"># 截取32字节作为AES密钥</span></span><br><span class="line">    iv = <span class="built_in">bytes</span>.fromhex(encrypted_data[:<span class="number">32</span>])  <span class="comment"># 提取IV</span></span><br><span class="line">    ct = <span class="built_in">bytes</span>.fromhex(encrypted_data[<span class="number">32</span>:])  <span class="comment"># 提取加密数据</span></span><br><span class="line">    cipher = AES.new(key, AES.MODE_CBC, iv)</span><br><span class="line">    decrypted_data = unpad(cipher.decrypt(ct), AES.block_size)</span><br><span class="line">    <span class="keyword">return</span> decrypted_data.decode(<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">compute_shared_key</span>(<span class="params">temp_public_key, private_key</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    计算共享密钥。</span></span><br><span class="line"><span class="string">    使用 ECC 的规则，基于临时公钥和私钥计算共享密钥。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    ecc_key = ECC.construct(curve=<span class="string">&#x27;secp256r1&#x27;</span>, d=<span class="built_in">int</span>(private_key, <span class="number">16</span>))</span><br><span class="line">    temp_pub_key = ECC.import_key(temp_public_key)</span><br><span class="line">    shared_key = ecc_key.d * temp_pub_key.pointQ  <span class="comment"># 共享密钥</span></span><br><span class="line">    compressed_shared_key = hashlib.sha256(<span class="built_in">str</span>(shared_key.x).encode(<span class="string">&#x27;utf-8&#x27;</span>)).digest()  <span class="comment"># 压缩共享密钥</span></span><br><span class="line">    <span class="keyword">return</span> compressed_shared_key</span><br><span class="line"></span><br><span class="line"><span class="comment"># ============================== 输出端功能 ==============================</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">analyze_and_convert</span>(<span class="params">file_path</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    分析文件并将其转换为 Base64 格式。</span></span><br><span class="line"><span class="string">    返回文件的 SHA256、大小、类型和 Base64 内容。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(file_path, <span class="string">&#x27;rb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            content = f.read()</span><br><span class="line">        sha256_hash = hashlib.sha256(content).hexdigest()</span><br><span class="line">        file_size = os.path.getsize(file_path)</span><br><span class="line">        file_type = file_path.split(<span class="string">&#x27;.&#x27;</span>)[-<span class="number">1</span>]</span><br><span class="line">        base64_content = base64.b64encode(content).decode(<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">        <span class="keyword">return</span> sha256_hash, file_size, file_type, base64_content</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="keyword">raise</span> ValueError(<span class="string">f&quot;File analysis failed: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">split_and_encrypt</span>(<span class="params">data, private_key, temp_private_key, chunk_size=<span class="number">1000</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    将数据分块并加密。</span></span><br><span class="line"><span class="string">    每个组块包含临时公钥、加密数据、字母编号、数字编号、SHA256校验值和组块数量。</span></span><br><span class="line"><span class="string">    返回加密后的组块列表。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    chunks = [data[i:i + chunk_size] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(data), chunk_size)]</span><br><span class="line">    encrypted_chunks = []</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># ECC 密钥生成</span></span><br><span class="line">        ecc_key = ECC.construct(curve=<span class="string">&#x27;secp256r1&#x27;</span>, d=<span class="built_in">int</span>(temp_private_key, <span class="number">16</span>))</span><br><span class="line">        public_key = ecc_key.public_key()</span><br><span class="line">        shared_key = <span class="built_in">int</span>(private_key, <span class="number">16</span>) * <span class="built_in">int</span>(ecc_key.d)  <span class="comment"># 共享密钥</span></span><br><span class="line">        compressed_shared_key = hashlib.sha256(<span class="built_in">str</span>(shared_key).encode(<span class="string">&#x27;utf-8&#x27;</span>)).digest()  <span class="comment"># 压缩共享密钥</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> idx, chunk <span class="keyword">in</span> <span class="built_in">enumerate</span>(chunks):</span><br><span class="line">            <span class="comment"># 使用 AES 对称加密加密数据</span></span><br><span class="line">            aes_encrypted_chunk = encrypt_data_aes(chunk, compressed_shared_key)</span><br><span class="line">            <span class="comment"># 组合数据：临时公钥 + AES 加密数据 + 字母编号 + 数字编号 + SHA256校验值 + 组块数量 + 文件后缀</span></span><br><span class="line">            hex_index = <span class="string">f&quot;<span class="subst">&#123;idx + <span class="number">1</span>:02X&#125;</span>&quot;</span>  <span class="comment"># 十六进制编号（两位）</span></span><br><span class="line">            encrypted_chunk = (</span><br><span class="line">                <span class="built_in">str</span>(public_key.export_key(<span class="built_in">format</span>=<span class="string">&#x27;PEM&#x27;</span>)) + <span class="string">&#x27;-&#x27;</span> +</span><br><span class="line">                aes_encrypted_chunk + <span class="string">&#x27;-&#x27;</span> +</span><br><span class="line">                <span class="string">&quot;A&quot;</span> + hex_index + <span class="string">&#x27;-&#x27;</span> +  <span class="comment"># 字母编号（假设单个文件）</span></span><br><span class="line">                hashlib.sha256(chunk.encode(<span class="string">&#x27;utf-8&#x27;</span>)).hexdigest() + <span class="string">&#x27;-&#x27;</span> +</span><br><span class="line">                <span class="built_in">str</span>(<span class="built_in">len</span>(chunks)) + <span class="string">&#x27;-&#x27;</span> +</span><br><span class="line">                file_type  <span class="comment"># 添加文件后缀</span></span><br><span class="line">            )</span><br><span class="line">            encrypted_chunks.append(encrypted_chunk)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="keyword">raise</span> ValueError(<span class="string">f&quot;ECC encryption failed: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">return</span> encrypted_chunks</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">generate_qr_codes_in_memory</span>(<span class="params">chunks, file_name</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    将加密后的组块生成二维码。</span></span><br><span class="line"><span class="string">    返回二维码的二进制数据列表。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    qr_images = []</span><br><span class="line">    file_qr_folder = os.path.join(ROOT_DIR, <span class="string">&quot;qrs&quot;</span>, file_name)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(file_qr_folder):</span><br><span class="line">        os.makedirs(file_qr_folder)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> idx, chunk <span class="keyword">in</span> <span class="built_in">enumerate</span>(chunks):</span><br><span class="line">        qr = qrcode.QRCode(version=<span class="number">1</span>, box_size=<span class="number">10</span>, border=<span class="number">5</span>)</span><br><span class="line">        qr.add_data(chunk)</span><br><span class="line">        qr.make(fit=<span class="literal">True</span>)</span><br><span class="line">        img = qr.make_image(fill_color=<span class="string">&quot;black&quot;</span>, back_color=<span class="string">&quot;white&quot;</span>)</span><br><span class="line">        buffer = io.BytesIO()</span><br><span class="line">        img.save(buffer, <span class="built_in">format</span>=<span class="string">&quot;PNG&quot;</span>)</span><br><span class="line">        buffer.seek(<span class="number">0</span>)  <span class="comment"># 将指针重置到文件开头</span></span><br><span class="line">        qr_images.append(buffer.getvalue())</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 保存二维码到文件夹</span></span><br><span class="line">        qr_path = os.path.join(file_qr_folder, <span class="string">f&quot;<span class="subst">&#123;file_name&#125;</span>_qr_<span class="subst">&#123;idx + <span class="number">1</span>&#125;</span>.png&quot;</span>)</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(qr_path, <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            f.write(buffer.getvalue())</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> qr_images</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/upload&#x27;</span>, methods=[<span class="string">&#x27;POST&#x27;</span>]</span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">upload_files</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    处理文件上传请求。</span></span><br><span class="line"><span class="string">    用户上传文件后，程序会分析文件、加密内容并生成二维码。</span></span><br><span class="line"><span class="string">    返回 JSON 格式的响应，包含上传结果和二维码路径。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&#x27;files&#x27;</span> <span class="keyword">not</span> <span class="keyword">in</span> request.files <span class="keyword">or</span> <span class="keyword">not</span> request.files.getlist(<span class="string">&#x27;files&#x27;</span>):</span><br><span class="line">            <span class="keyword">return</span> jsonify(&#123;<span class="string">&#x27;error&#x27;</span>: <span class="string">&#x27;No files uploaded&#x27;</span>&#125;), <span class="number">400</span></span><br><span class="line"></span><br><span class="line">        files = request.files.getlist(<span class="string">&#x27;files&#x27;</span>)</span><br><span class="line">        saved_files = []</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 加载私钥和临时私钥</span></span><br><span class="line">        excel_path = os.path.join(ROOT_DIR, <span class="string">&quot;key.xlsx&quot;</span>)  <span class="comment"># 私钥文件路径</span></span><br><span class="line">        private_keys, temp_private_keys = load_keys_from_excel(excel_path)</span><br><span class="line"></span><br><span class="line">        all_qr_paths = []</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> i, file <span class="keyword">in</span> <span class="built_in">enumerate</span>(files):</span><br><span class="line">            <span class="keyword">if</span> file.filename == <span class="string">&#x27;&#x27;</span>:</span><br><span class="line">                <span class="keyword">continue</span>  <span class="comment"># 跳过空文件名</span></span><br><span class="line">            file_path = os.path.join(ROOT_DIR, <span class="string">&quot;uploads&quot;</span>, file.filename)</span><br><span class="line">            file.save(file_path)</span><br><span class="line">            saved_files.append(file.filename)</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 分析文件并生成二维码</span></span><br><span class="line">            sha256_hash, file_size, file_type, base64_content = analyze_and_convert(file_path)</span><br><span class="line">            header = <span class="string">f&quot;<span class="subst">&#123;file_type&#125;</span>-<span class="subst">&#123;file_size&#125;</span>-<span class="subst">&#123;sha256_hash&#125;</span>-&quot;</span></span><br><span class="line">            data = header + base64_content</span><br><span class="line">            encrypted_chunks = split_and_encrypt(data, private_keys[i], temp_private_keys[i])</span><br><span class="line">            qr_images = generate_qr_codes_in_memory(encrypted_chunks, file.filename)</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 保存二维码路径</span></span><br><span class="line">            file_qr_folder = os.path.join(ROOT_DIR, <span class="string">&quot;qrs&quot;</span>, file.filename)</span><br><span class="line">            qr_paths = [<span class="string">f&quot;/static/qrs/<span class="subst">&#123;file.filename&#125;</span>/<span class="subst">&#123;file.filename&#125;</span>_qr_<span class="subst">&#123;j + <span class="number">1</span>&#125;</span>.png&quot;</span> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(qr_images))]</span><br><span class="line">            all_qr_paths.extend(qr_paths)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> jsonify(&#123;</span><br><span class="line">            <span class="string">&#x27;message&#x27;</span>: <span class="string">&#x27;Files uploaded successfully!&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;files&#x27;</span>: saved_files,</span><br><span class="line">            <span class="string">&#x27;qr_paths&#x27;</span>: all_qr_paths</span><br><span class="line">        &#125;)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="keyword">return</span> jsonify(&#123;<span class="string">&#x27;error&#x27;</span>: <span class="string">f&#x27;Server error: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&#x27;</span>&#125;), <span class="number">500</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/&#x27;</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">index</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    渲染首页。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> render_template_string(<span class="built_in">open</span>(template_html_path, <span class="string">&#x27;r&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>).read())</span><br><span class="line"></span><br><span class="line"><span class="comment"># ============================== 输入端功能 ==============================</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">scan_qr_code</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    扫描二维码。</span></span><br><span class="line"><span class="string">    使用 OpenCV 打开摄像头，实时扫描二维码并返回扫描到的数据。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    cap = cv2.VideoCapture(<span class="number">0</span>)  <span class="comment"># 打开摄像头</span></span><br><span class="line">    scanned_data = []</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        ret, frame = cap.read()</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> ret:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;无法读取摄像头画面&quot;</span>)</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 使用 OpenCV 检测二维码</span></span><br><span class="line">        detector = cv2.QRCodeDetector()</span><br><span class="line">        data, bbox, _ = detector.detectAndDecode(frame)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> data:</span><br><span class="line">            scanned_data.append(data)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;已扫描二维码: <span class="subst">&#123;data&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 显示扫描到的二维码编号</span></span><br><span class="line">            cv2.putText(frame, <span class="string">f&quot;Scanned: <span class="subst">&#123;<span class="built_in">len</span>(scanned_data)&#125;</span>&quot;</span>, (<span class="number">10</span>, <span class="number">30</span>), cv2.FONT_HERSHEY_SIMPLEX, <span class="number">1</span>, (<span class="number">0</span>, <span class="number">255</span>, <span class="number">0</span>), <span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 显示摄像头画面</span></span><br><span class="line">        cv2.imshow(<span class="string">&quot;QR Code Scanner&quot;</span>, frame)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 按下 &#x27;q&#x27; 键退出</span></span><br><span class="line">        <span class="keyword">if</span> cv2.waitKey(<span class="number">1</span>) &amp; <span class="number">0xFF</span> == <span class="built_in">ord</span>(<span class="string">&#x27;q&#x27;</span>):</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">    cap.release()</span><br><span class="line">    cv2.destroyAllWindows()</span><br><span class="line">    <span class="keyword">return</span> scanned_data</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">process_scanned_data</span>(<span class="params">scanned_data, private_keys</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    处理解密和文件还原。</span></span><br><span class="line"><span class="string">    根据扫描到的二维码数据，解密并拼接成原始文件。</span></span><br><span class="line"><span class="string">    返回还原的文件内容和文件扩展名。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    decrypted_chunks = &#123;&#125;</span><br><span class="line">    file_extension = <span class="literal">None</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> data <span class="keyword">in</span> scanned_data:</span><br><span class="line">        parts = data.split(<span class="string">&#x27;-&#x27;</span>)</span><br><span class="line">        temp_public_key = parts[<span class="number">0</span>]</span><br><span class="line">        encrypted_chunk = parts[<span class="number">1</span>]</span><br><span class="line">        file_info = parts[<span class="number">2</span>]  <span class="comment"># 包含字母编号、SHA256 和组块数量</span></span><br><span class="line">        sha256_hash = parts[<span class="number">3</span>]</span><br><span class="line">        total_chunks = <span class="built_in">int</span>(parts[<span class="number">4</span>])</span><br><span class="line">        extension = parts[<span class="number">5</span>]  <span class="comment"># 文件后缀</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 确定文件后缀（仅需一次）</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> file_extension:</span><br><span class="line">            file_extension = extension</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 获取对应的私钥</span></span><br><span class="line">        private_key = private_keys[<span class="built_in">ord</span>(file_info[<span class="number">0</span>]) - <span class="built_in">ord</span>(<span class="string">&#x27;A&#x27;</span>)]  <span class="comment"># 根据字母索引获取私钥</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 计算共享密钥</span></span><br><span class="line">        shared_key = compute_shared_key(temp_public_key, private_key)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 解密数据</span></span><br><span class="line">        decrypted_data = decrypt_data_aes(encrypted_chunk, shared_key)</span><br><span class="line">        decrypted_chunks[file_info] = decrypted_data</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 按顺序拼接数据</span></span><br><span class="line">    sorted_keys = <span class="built_in">sorted</span>(decrypted_chunks.keys())  <span class="comment"># 按文件编号排序</span></span><br><span class="line">    full_data = <span class="string">&#x27;&#x27;</span>.join([decrypted_chunks[key] <span class="keyword">for</span> key <span class="keyword">in</span> sorted_keys])</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 还原文件</span></span><br><span class="line">    file_content = base64.b64decode(full_data)</span><br><span class="line">    <span class="keyword">return</span> file_content, file_extension</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">input_end_main</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    输入端主函数。</span></span><br><span class="line"><span class="string">    启动摄像头扫描二维码，并将扫描到的内容解密还原为文件。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    excel_path = os.path.join(ROOT_DIR, <span class="string">&quot;key.xlsx&quot;</span>)  <span class="comment"># 私钥文件路径</span></span><br><span class="line">    private_keys = load_keys_from_excel(excel_path)</span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;开始扫描二维码...&quot;</span>)</span><br><span class="line">    scanned_data = scan_qr_code()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> scanned_data:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;未扫描到任何二维码&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;正在处理扫描数据...&quot;</span>)</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        file_content, file_extension = process_scanned_data(scanned_data, private_keys)</span><br><span class="line">        output_file = os.path.join(ROOT_DIR, <span class="string">f&quot;output_file.<span class="subst">&#123;file_extension&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(output_file, <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            f.write(file_content)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;文件已保存为: <span class="subst">&#123;output_file&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;处理失败: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># ============================== 主程序入口 ==============================</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    主程序入口。</span></span><br><span class="line"><span class="string">    用户可以选择运行输出端功能或输入端功能。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;请选择功能：&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;1. 输出端功能（上传文件并生成二维码）&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;2. 输入端功能（扫描二维码并还原文件）&quot;</span>)</span><br><span class="line">        choice = <span class="built_in">input</span>(<span class="string">&quot;请输入选项（1 或 2）：&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> choice == <span class="string">&#x27;1&#x27;</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;启动 Flask 服务器...&quot;</span>)</span><br><span class="line">            app.run(host=<span class="string">&#x27;0.0.0.0&#x27;</span>, debug=<span class="literal">False</span>, port=<span class="number">8000</span>)</span><br><span class="line">        <span class="keyword">elif</span> choice == <span class="string">&#x27;2&#x27;</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;启动输入端功能...&quot;</span>)</span><br><span class="line">            input_end_main()</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;无效选项，请重新运行程序。&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;程序运行失败: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>二维码展示<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-tag">body</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-family</span>: Arial, sans-serif;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">justify-content</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">align-items</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">100vh</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: <span class="number">#f4f4f9</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.upload-area</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">300px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">200px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border</span>: <span class="number">2px</span> dashed <span class="number">#ccc</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">justify-content</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">align-items</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">flex-direction</span>: column;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">text-align</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="number">#666</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">cursor</span>: pointer;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.upload-area</span><span class="selector-pseudo">:hover</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-color</span>: <span class="string">&#x27;#aaa&#x27;</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.hidden-input</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: none;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.progress-container</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-top</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.progress-bar</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">0%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: <span class="number">#4caf50</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">transition</span>: width <span class="number">0.3s</span> ease;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.status</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-top</span>: <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">14px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="number">#333</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;upload-area&quot;</span> <span class="attr">id</span>=<span class="string">&quot;uploadArea&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">p</span>&gt;</span>拖动文件到这里<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">p</span>&gt;</span>或者<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">&quot;document.getElementById(&#x27;fileInput&#x27;).click()&quot;</span>&gt;</span>选择文件<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;file&quot;</span> <span class="attr">id</span>=<span class="string">&quot;fileInput&quot;</span> <span class="attr">class</span>=<span class="string">&quot;hidden-input&quot;</span> <span class="attr">multiple</span> <span class="attr">onchange</span>=<span class="string">&quot;handleFiles(this.files)&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;progress-container&quot;</span> <span class="attr">id</span>=<span class="string">&quot;progressContainer&quot;</span> <span class="attr">style</span>=<span class="string">&quot;display: none;&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;progress-bar&quot;</span> <span class="attr">id</span>=<span class="string">&quot;progressBar&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;status&quot;</span> <span class="attr">id</span>=<span class="string">&quot;status&quot;</span>&gt;</span>上传中...<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> uploadArea = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;uploadArea&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> progressContainer = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;progressContainer&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> progressBar = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;progressBar&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> status = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;status&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="comment">// 处理文件上传</span></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">function</span> <span class="title function_">handleFiles</span>(<span class="params">files</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> formData = <span class="keyword">new</span> <span class="title class_">FormData</span>();</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">for</span> (<span class="keyword">const</span> file <span class="keyword">of</span> files) &#123;</span></span><br><span class="line"><span class="language-javascript">                formData.<span class="title function_">append</span>(<span class="string">&#x27;files&#x27;</span>, file);</span></span><br><span class="line"><span class="language-javascript">            &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">            <span class="comment">// 显示进度条</span></span></span><br><span class="line"><span class="language-javascript">            progressContainer.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;block&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">            <span class="comment">// 创建 EventSource 连接</span></span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> eventSource = <span class="keyword">new</span> <span class="title class_">EventSource</span>(<span class="string">`/upload`</span>, &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">method</span>: <span class="string">&#x27;POST&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">headers</span>: &#123;</span></span><br><span class="line"><span class="language-javascript">                    <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/json&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">                &#125;,</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">body</span>: formData,</span></span><br><span class="line"><span class="language-javascript">            &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">            eventSource.<span class="property">onmessage</span> = <span class="keyword">function</span>(<span class="params">event</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="keyword">const</span> data = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(event.<span class="property">data</span>);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">                <span class="comment">// 更新进度条</span></span></span><br><span class="line"><span class="language-javascript">                progressBar.<span class="property">style</span>.<span class="property">width</span> = <span class="string">`<span class="subst">$&#123;data.progress&#125;</span>%`</span>;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">                <span class="comment">// 更新状态信息</span></span></span><br><span class="line"><span class="language-javascript">                status.<span class="property">textContent</span> = data.<span class="property">message</span>;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">                <span class="comment">// 如果上传完成，关闭连接</span></span></span><br><span class="line"><span class="language-javascript">                <span class="keyword">if</span> (data.<span class="property">progress</span> === <span class="number">100</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">                    eventSource.<span class="title function_">close</span>();</span></span><br><span class="line"><span class="language-javascript">                    <span class="title function_">alert</span>(<span class="string">&#x27;文件上传成功！&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">                &#125;</span></span><br><span class="line"><span class="language-javascript">            &#125;;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">            eventSource.<span class="property">onerror</span> = <span class="keyword">function</span>(<span class="params">error</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;上传失败:&#x27;</span>, error);</span></span><br><span class="line"><span class="language-javascript">                <span class="title function_">alert</span>(<span class="string">&#x27;文件上传失败，请重试！&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">                eventSource.<span class="title function_">close</span>();</span></span><br><span class="line"><span class="language-javascript">            &#125;;</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="comment">// 拖放事件处理</span></span></span><br><span class="line"><span class="language-javascript">        uploadArea.<span class="title function_">addEventListener</span>(<span class="string">&#x27;dragover&#x27;</span>, <span class="function">(<span class="params">e</span>) =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">            e.<span class="title function_">preventDefault</span>();</span></span><br><span class="line"><span class="language-javascript">            uploadArea.<span class="property">style</span>.<span class="property">borderColor</span> = <span class="string">&#x27;#aaa&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">        &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        uploadArea.<span class="title function_">addEventListener</span>(<span class="string">&#x27;dragleave&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">            uploadArea.<span class="property">style</span>.<span class="property">borderColor</span> = <span class="string">&#x27;#ccc&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">        &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        uploadArea.<span class="title function_">addEventListener</span>(<span class="string">&#x27;drop&#x27;</span>, <span class="function">(<span class="params">e</span>) =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">            e.<span class="title function_">preventDefault</span>();</span></span><br><span class="line"><span class="language-javascript">            uploadArea.<span class="property">style</span>.<span class="property">borderColor</span> = <span class="string">&#x27;#ccc&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> files = e.<span class="property">dataTransfer</span>.<span class="property">files</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="title function_">handleFiles</span>(files);</span></span><br><span class="line"><span class="language-javascript">        &#125;);</span></span><br><span class="line"><span class="language-javascript">    </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure>              </div>            </details><p>事实上，这玩意是真长…</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>咳咳，这个代码基本上实现了我想要的功能，就是…需要优化…有点难搞。<br>琢磨这些代码，我不惜牺牲玩的时间，最后好像成了，但是…有一个新问题出来了！就是这个该死的“405”报错！<br>GET <a href="http://127.0.0.1:8000/upload">http://127.0.0.1:8000/upload</a> 405 (METHOD NOT ALLOWED)<br>这就导致我无法上传文件，很奇怪，但我也不知道该怎么办，网上查的话…一点也看不懂（好笨…）。我试了试之前的代码（还没有整合的时候），发现那时候的也是这个问题，我很纳闷。所以，我会附上源码，我与AI的对话过程，还有一个二维码图片示例，你们可以自己琢磨琢磨…<br>最后，我还想提一嘴，盲猜有人说，为什么要用ECC加密…我乐意！不过这个对现在的Bug好像没影响。<br>最后…的最后，附上文件（密码GKZJ）：</p><a class="btn-anzhiyu " href="https://tabotef134.lanzoul.com/b0pmfbo7a"   title="点击此处查看"><i class="anzhiyufont anzhiyu-icon-circle-arrow-right"></i><span>点击此处查看</span></a><p class='p red center small'>最后...最后的最后，这篇文章应该是我在高考前的最后一篇文章了，再见！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;note info simple&quot;&gt;&lt;p&gt;info 本文章代码均为AI生成，请注意仔细甄别！&lt;br&gt;使用模型：海螺AI，deepseek R1；Qwen2.5-Max&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;</summary>
      
    
    
    
    <category term="科技" scheme="https://blog.jiyu134.top/categories/%E7%A7%91%E6%8A%80/"/>
    
    
    <category term="科技" scheme="https://blog.jiyu134.top/tags/%E7%A7%91%E6%8A%80/"/>
    
  </entry>
  
  <entry>
    <title>新年快乐...（有点迟）</title>
    <link href="https://blog.jiyu134.top/posts/2025year/"/>
    <id>https://blog.jiyu134.top/posts/2025year/</id>
    <published>2025-02-03T09:42:50.619Z</published>
    <updated>2025-02-03T09:42:50.619Z</updated>
    
    <content type="html"><![CDATA[<p>什么？已经2025年了吗？好快！一转眼博客已经开了2年了（真是不容易呢！）<br>首先，很感谢各位可以点开我的博客，谢谢！(｡・ω・｡)<br>最近，我一直在为高考做准备，没时间打理博客实在是有点抱歉，不过这也是有情可原的，对吧！嘻嘻，高三生活的的确确很累，不断复习知识，刷题，感觉自己好像老了老几岁( ´Д&#96;)y━･~~节奏紧张，没办法嘛…<br>在这里我想插一句，不是我不想更新友链，而是电脑不在身旁，还有pushplus于2024年8月1日实行网站实名制，但是我又不知道，导致了我的邮箱一直没有收到最近的消息。这里对向我发出友链申请的朋友们诚恳的道个歉！<br>《兽言爪道》啊…我好像一直没有更新…<em>（我发现我有好多对不起的地方）</em>原因是我其实对内容还没有很大的把握，真的，我很希望能把它搞好，但是出于学业原因…不得已把它推迟了，实在是抱歉…<br>啊！好久没有维护网站了，有些地方还是有些修不回来了（哭）。如果有时间的话再说吧（拖延症）<br>但无论怎样，2025年的序幕已经拉开，让我们满怀信心和期待，迎接新的挑战和机遇。很感谢大家一直以来的支持和陪伴，愿我们在新的一年里，继续携手同行，共创辉煌！<br>祝大家新年快乐，万事如意！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;什么？已经2025年了吗？好快！一转眼博客已经开了2年了（真是不容易呢！）&lt;br&gt;首先，很感谢各位可以点开我的博客，谢谢！(｡・ω・｡)&lt;br&gt;最近，我一直在为高考做准备，没时间打理博客实在是有点抱歉，不过这也是有情可原的，对吧！嘻嘻，高三生活的的确确很累，不断复习知识，刷</summary>
      
    
    
    
    
    <category term="生活" scheme="https://blog.jiyu134.top/tags/%E7%94%9F%E6%B4%BB/"/>
    
  </entry>
  
  <entry>
    <title>/置顶/每年一卡</title>
    <link href="https://blog.jiyu134.top/posts/card/"/>
    <id>https://blog.jiyu134.top/posts/card/</id>
    <published>2025-01-27T12:52:36.386Z</published>
    <updated>2025-01-27T12:52:36.386Z</updated>
    
    <content type="html"><![CDATA[<div class="tip key"><ol><li>每年一卡是一个长期项目，会一直做下去。</li><li>该项目自2021年开始，每年会做一张卡片。</li><li>每年一卡5周年啦！</li><li>由于图片量较大，请各位耐心等待一下，谢谢！</li></ol></div><div class="tip success"><p>值得一提的是，“狼方计划”（SWP）归属于激鱼个人使用。目前仅仅使用在了“每年一卡”项目里，说不定…以后也会用到。<br>“SWP”全称Squared Wolf Plan<br>-写于2025年2月11日15:50:36</p></div><p class='p center logo large'>2025年每年一卡！</p><p><img src="https://www.z4a.net/images/2025/01/27/A.jpg" alt="A.jpg"><br><img src="https://www.z4a.net/images/2025/01/27/B.jpg" alt="B.jpg"></p><p class='p blue'>有感：</p><p>真的很感谢各位，“每年一卡”项目已经5周年啦！从起初到现在，我一直在进步，对卡进行不断修缮处理，最终得到了这样的结果，很感谢各位的支持。<br>我希望未来能更上一层楼，让计划延续下去。<br>Let us 加油！<br>-写于…2025年2月11日之前…</p><p class='p green'>声明:</p><ol><li>此系列卡片<mark class="hl-label orange">版权归激鱼</mark> 所有，不得进行任何商业性行为。</li><li>此卡过期则为纪念性卡片，不在对外发放。</li><li>该卡设计时间为2025年1月27日。</li><li>卡的原图请点击下方按钮查看（密码为：JYNB）<a class="btn-anzhiyu " href="https://tabotef134.lanzoul.com/itp442m3sewh"   title="查看"><span>查看</span></a></li></ol><p class='p center small cyan'>旧版本</p><details class="folding-tag" green><summary> 2024 </summary>              <div class='content'>              <p><img src="https://www.z4a.net/images/2024/02/05/bf1fb610106d441b34cc43a03592f1a9.jpg" alt="bf1fb610106d441b34cc43a03592f1a9.jpg"><br><img src="https://www.z4a.net/images/2024/02/05/2a168c32f106e847497138b36b851f20.jpg" alt="2a168c32f106e847497138b36b851f20.jpg"><br>本卡的背景图（5K,1080P），卡的原图请点击按钮查看（密码为：JYNB）<br><a class="btn-anzhiyu " href="https://tabotef134.lanzoul.com/icdOf1nfb38h"   title="查看"><span>查看</span></a></p>              </div>            </details><details class="folding-tag" green><summary> 2023新 </summary>              <div class='content'>              <p><img src="https://www.z4a.net/images/2023/05/21/2023-1-1.png" alt="2023-1-1.png"><br><img src="https://www.z4a.net/images/2023/05/21/2023-2-1.png" alt="2023-2-1.png"></p>              </div>            </details><details class="folding-tag" green><summary> 2023旧 </summary>              <div class='content'>              <p><img src="https://www.z4a.net/images/2023/01/04/747c222797166bf399856ba4574dddef507578721.png" alt="2023正"><br><img src="https://www.z4a.net/images/2023/01/04/8526ced55a7113bb5e1182c5af778af0507578721.png" alt="2023反"></p>              </div>            </details><details class="folding-tag" green><summary> 2022 </summary>              <div class='content'>              <p><img src="https://www.z4a.net/images/2023/01/04/fb67ec5a13a06463c27cc476fb24ff10.png" alt="2022反"><br><img src="https://www.z4a.net/images/2023/01/04/d25f62f7c53e7a9d6f93ebc87e69129a.png" alt="2022正"></p>              </div>            </details><details class="folding-tag" green><summary> 2021 </summary>              <div class='content'>              <p><img src="https://www.z4a.net/images/2023/01/04/38711e371d1a02508f6320fb7a9dca9d.png" alt="2021反"><br><img src="https://www.z4a.net/images/2023/01/04/22bf6372343c4d2c36e2a867f44924c1.png" alt="2021正"></p>              </div>            </details>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;tip key&quot;&gt;&lt;ol&gt;
&lt;li&gt;每年一卡是一个长期项目，会一直做下去。&lt;/li&gt;
&lt;li&gt;该项目自2021年开始，每年会做一张卡片。&lt;/li&gt;
&lt;li&gt;每年一卡5周年啦！&lt;/li&gt;
&lt;li&gt;由于图片量较大，请各位耐心等待一下，谢谢！&lt;/li&gt;
&lt;/ol</summary>
      
    
    
    
    
    <category term="每年一卡" scheme="https://blog.jiyu134.top/tags/%E6%AF%8F%E5%B9%B4%E4%B8%80%E5%8D%A1/"/>
    
  </entry>
  
  <entry>
    <title>兽言爪道-第五章-如扎心般痛</title>
    <link href="https://blog.jiyu134.top/posts/ddd0/"/>
    <id>https://blog.jiyu134.top/posts/ddd0/</id>
    <published>2024-08-22T11:52:13.967Z</published>
    <updated>2024-08-22T11:52:13.967Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;&emsp;天已经完全暗下来了，纳良拿出洗漱的物品去洗漱了，而孜岚坐在椅子上，看着窗外的景色。他现在想：“所以…我到底是为什么失忆的呢？我为什么…‘它’…到底是为什么会发生这种事情的呢？”这个问题的确很难搞。<br>&emsp;&emsp;纳良洗完漱直接躺在床上睡觉了——看来确实累坏了。孜岚看着他，内心想：“这家伙睡得倒挺快。”<br>&emsp;&emsp;但是莫名的心里有点难受，感觉自己好像被什么所抓住。<br>&emsp;&emsp;“呃…”<br>&emsp;&emsp;孜岚想发声但是不能，他难受地趴在地上，可是纳良却没有理睬——睡得真的很死。<br>&emsp;&emsp;“救救我…”<br>&emsp;&emsp;突然，一阵耳鸣后，这些不适感消失了。孜岚站了起来，这时纳良起身，看着孜岚。“嗯？你怎么还不睡？”<br>&emsp;&emsp;他不是睡着了吗？为什么…<br>&emsp;&emsp;“喂，没事吧？嘿！”孜岚缓过神来，才发现纳良已经走到他跟前了。他发呆有一段时间了。<br>&emsp;&emsp;“要不，明天带你去看看医生？”纳良捏一捏孜岚的脸。<br>&emsp;&emsp;“啊，好疼。不用了。”<br>&emsp;&emsp;纳良看他拒绝了，也不说啥了，继续躺在床上睡了。<br>&emsp;&emsp;“刚刚的…没事吧。”<br>&emsp;&emsp;孜岚简单洗洗漱后也睡了。<br>&emsp;&emsp;……<br>&emsp;&emsp;早上，天还未完全亮，孜岚把纳良叫了起来。<br>&emsp;&emsp;“嗯？孜岚，你这次起得好早，之前不都是我叫你吗？”<br>&emsp;&emsp;孜岚十分不开心，说：“昨天晚上你倒是睡得挺香，你的呼噜声是真的大啊！”<br>&emsp;&emsp;纳良害羞了几秒，说：“嗯…好啦，我东西都准备好了，要不先吃个面包？放心，还有1个月才过期…”<br>&emsp;&emsp;孜岚接过面包，吃起来。只吃面包或许有点干，他从桌子上拿起杯子，接了点水，继续吃了起来。这面包味道还行。<br>&emsp;&emsp;孜岚回头看纳良，他正啃着肉腿，很是享受。<br>&emsp;&emsp;“嗯？你这从哪来的？”孜岚瞪着大眼，叫道。<br>&emsp;&emsp;“门口有早餐，我看你吃面包这么投入，我没开口。”<br>&emsp;&emsp;看来，今天又是纳良欠揍的一天呢。<br>&emsp;&emsp;……<br>&emsp;&emsp;下楼，孜岚那生气的表情还是没有消退。但他好像是感觉到了什么似的，突然转了下身，然后拉着纳良快速跑出旅馆。<br>&emsp;&emsp;“怎么了，你想吃东西也不用这么急啊…”<br>&emsp;&emsp;孜岚小声说：“嘘，跑就对了。”<br>&emsp;&emsp;跑了几分钟，直到孜岚感觉一切安全后，停了下来。<br>&emsp;&emsp;“孜岚，你大早上的干什么啊？跑这么快，快累死我了。”纳良大喘气说道。<br>&emsp;&emsp;孜岚环视了四周，说：“嗯，这地方应该比较安全一点。”他拍拍纳良，继续说，“我刚才一下楼的时候，就感觉不对劲，总感觉有兽在跟着咱俩，大概前面的路可能会有埋伏，最好小心点。”<br>&emsp;&emsp;纳良歪着头，说：“啊？你这么确定？”<br>&emsp;&emsp;“我的直觉告诉我应该不会错。”孜岚肯定地说。“你说，不会是有…坏叔叔…吧？”纳良紧张地说。<br>&emsp;&emsp;“不错！”一个带着墨镜的兽人拍着爪笑道，孜岚回头一看，瞪大了眼。<br>&emsp;&emsp;“你是谁！啊…”孜岚被这么重重的一拳给击晕了。纳良一时没反应过来，有些迟钝。<br>&emsp;&emsp;“呃啊！”好吧，纳良也没能逃出来。<br>&emsp;&emsp;“去，把他俩个拖走！”<br>&emsp;&emsp;“是！”<br>&emsp;&emsp;……<br>&emsp;&emsp;“滋滋…滋滋…”信号干扰声出现在孜岚身边。孜岚好像置身于一个虚无空间之中，但他没有任何生气，只是沉默的呆在那里。<br>&emsp;&emsp;“只能先这样子了，哎呀，真是麻烦，我可怎么换个位置安置这个家伙呢？算了，自己揽的活自己得干！或者…这个应该可以。”<br>&emsp;&emsp;“正好我这里资料留了不少，那么，我得找个…来帮我。”<br>&emsp;&emsp;……<br>&emsp;&emsp;大概过了不知多久，孜岚醒了，他和纳良在一个未知的地方的笼子里，周围没有兽，只有死一般的寂静。<br>&emsp;&emsp;“喂，纳良，醒醒！该死，我现在怎么在他们的基地里？！不会吧…”<br>&emsp;&emsp;自言自语着，纳良睁开了眼，拍了拍头说：“呃…孜岚，你醒了。”<br>&emsp;&emsp;“可恶，该怎么出去？”<br>&emsp;&emsp;纳良晃了晃脑袋，试图清醒过来。纳良看着孜岚说：“等等，你现在是失忆前的还是失忆之后的？”<br>&emsp;&emsp;“前…这下子麻烦了，我没有带任何工具啊。”<br>&emsp;&emsp;这时，一个麦色狼兽人走进来，看着他俩。<br>&emsp;&emsp;纳良有点慌，对着他叫道：“你别过来啊！”<br>&emsp;&emsp;“嘘，小点声！放心，我和他们不一样，我来帮你们打开笼子。”<br>&emsp;&emsp;他从兜里掏出来一堆钥匙，轻松的找到一把能开笼子的，把它插了进去。<br>&emsp;&emsp;“居然，真的开了。”那兽小声的说，随即打开门，让他们出去。<br>&emsp;&emsp;“好了，接下来你们要小心了。我在这里布置了一些密道。”他只是告诉密道的位置就立马跑了。<br>&emsp;&emsp;“这兽怎么回事？”纳良纳闷道。孜岚表情严肃，他们得快速离开这个地方。“走，纳良。”<br>&emsp;&emsp;……<br>&emsp;&emsp;他们伸出头来，观察走廊——居然一个兽也没有？<br>&emsp;&emsp;“好奇怪…”纳良挠挠头，小声说。<br>&emsp;&emsp;“好了，按照他所说的，那个密道就在隔壁，走。”他们小心翼翼的走到隔壁，小心的打开门——也是一个兽也没有。<br>&emsp;&emsp;“为什么…”<br>&emsp;&emsp;他们走到一块砖的上面，看着上面的标记，开心了。<br>&emsp;&emsp;“就是这个！”纳良叫道。孜岚连忙捂住他的嘴。“你给我小声一点。等等，不对，这上面有红色标记！”<br>&emsp;&emsp;还记得那兽说过，“如果有红色标记就不要试了，那里已经不能出去了。不过因为实在是太久远了，我不记得哪些有红色标记了。”<br>&emsp;&emsp;“看来这条路行不通…那就去二楼，楼梯对面的房间有…不好！有兽来了，快藏起来！”<br>&emsp;&emsp;纳良看到旁边有柜子，连忙指挥孜岚进去。<br>&emsp;&emsp;……<br>&emsp;&emsp;透过缝，能看到是一个穿着白衣服的狼兽人进来了。<br>&emsp;&emsp;“真是可恶！实验体怎么能跑出来？这下子…”进来的那兽抱怨说。<br>&emsp;&emsp;“队长，那两个跑了！”另一个兽人跑了过来，说。<br>&emsp;&emsp;“什么？可恶！！！算了，先不管他们两个，先把实验体抓到再说！”<br>&emsp;&emsp;“是！”<br>&emsp;&emsp;“这一天天的…不行，我得去看看他们办事的。”</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&amp;emsp;&amp;emsp;天已经完全暗下来了，纳良拿出洗漱的物品去洗漱了，而孜岚坐在椅子上，看着窗外的景色。他现在想：“所以…我到底是为什么失忆的呢？我为什么…‘它’…到底是为什么会发生这种事情的呢？”这个问题的确很难搞。&lt;br&gt;&amp;emsp;&amp;emsp;纳良洗完漱直接躺在床上</summary>
      
    
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/categories/furry-said-claw-truth/"/>
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/tags/furry-said-claw-truth/"/>
    
  </entry>
  
  <entry>
    <title>兽言爪道-第四章-一个身体，两个灵魂？</title>
    <link href="https://blog.jiyu134.top/posts/7149/"/>
    <id>https://blog.jiyu134.top/posts/7149/</id>
    <published>2024-08-22T11:50:49.482Z</published>
    <updated>2024-08-22T11:50:49.482Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;&emsp;孜岚甩甩头，想要把头上的水甩掉。<br>&emsp;&emsp;“什么情况？你不是失忆了吗？”纳良说。<br>&emsp;&emsp;孜岚一脸懵，他大张着嘴巴，歪着头看着纳良，说：“什么失忆，我有失过忆吗？纳良，咱现在在哪啊？你不是要我搬家来着，我记得我当时在沙滩边，想看看海，但是突然头晕，然后就不知道了。这…都发生了什么啊？”<br>&emsp;&emsp;纳良长叹了一口气，无奈下把失忆后的孜岚所发生的事以简单易懂的方式叙述了一遍。<br>&emsp;&emsp;“就是这样，我好奇怪为什么会这样，那么既然没事，就继续走吧。”<br>&emsp;&emsp;孜岚听完陷入了沉思，他站起来，把左手放在嘴前，对纳良说：“也就是说，我失忆过一段时间。但…我在那段时间内是无意识的，也就是说我这具身体有两个灵魂在用？如果真的是这样子的话，那可真是太奇怪了！”<br>&emsp;&emsp;纳良看着孜岚，有些惊讶道：“不是你确定是这样吗？我咋感觉你在搞怪呢？”可孜岚却坚定地说确实没在搞怪。<br>&emsp;&emsp;“嘶，真的是…咱也不知道‘它’会不会再来，要不你给‘它’留点信息，就是不知道‘它’什么会出现。喏，这是纸和笔。”<br>&emsp;&emsp;“我看可以。”孜岚接下纳良从包里掏出的纸和笔，一边想到底怎么简短的写，一般快速写下了一点内容。<br>&emsp;&emsp;但还没写几个字，他突然感觉有点晕眩，疲惫的感觉涌上身体，他努力地把纸团攒在一起。“好晕，难道是…‘它’？不行…意识…有点…”<br>&emsp;&emsp;“孜岚，你还好吗？喂！”<br>&emsp;&emsp;孜岚晕了过去。纳良赶忙把他平稳的放倒在地上。他拿好孜岚团成一团的纸条，等着‘它’的到来。<br>&emsp;&emsp;过去了一两分钟,他终于醒了，身子震一下，大叫道：“啊！要被冲走了！诶？我怎么在岸上？诶，纳良干嘛用那么沉重的眼神看着我？”<br>&emsp;&emsp;“嗯…孜岚，或许有些事情可能我要和你说明一下。”<br>&emsp;&emsp;……<br>&emsp;&emsp;孜岚边点头边回应纳良：“嗯，也就是说，我被石头砸了，导致失忆前的“我”出来了，这真是太奇怪了！”纳良拿出纸条，说：“这是它写的，写了一半就晕过去了。”<br>&emsp;&emsp;纸条内用比较潦草的字写了几句话：<br>&emsp;&emsp;“父亲是孜(zī)豫(yù)，母亲是莞(wǎn)荣(róng)。有重要的任务需要完成，是……”<br>&emsp;&emsp;到这里就断了，应该是写在这个时候晕过去了。<br>&emsp;&emsp;“这信息，不能说没用，只能说这信息不是我问问就出来的嘛…哎！”<br>&emsp;&emsp;他们收拾收拾，一边聊一边走着，不知道走了几个小时。<br>&emsp;&emsp;孜岚向前仔细一看，开心地说：“你瞧！前面有灯光，终于看到村子了，纳良,走！”<br>&emsp;&emsp;等到他们到村子的时候,天已经基本暗下来了。<br>&emsp;&emsp;纳良看着村中一片热闹的样子，很开心。而孜岚现在已经很饿了。<br>&emsp;&emsp;纳良看孜岚走不动的样子，对他说：“要不先找个餐厅吃个饭,反正有很多钱…对吧！”孜岚苦笑了一下，想说纳良好穷啊，但是终究是没有说出来，他说的是：“我…啊对对对…走吧。”<br>&emsp;&emsp;纳良真会挑地方，挑了个看样子就很豪华的饭店。<br>&emsp;&emsp;“两位先生好，想要点些什么呢?”白毛的熊兽人——应该是服务员——站在站台上，微笑地说。<br>&emsp;&emsp;“嗯，来碗白菜粉丝汤吧。”纳良说。<br>&emsp;&emsp;“不是，来这里你就吃这个？这里可是有这么多美食…”孜岚看着贴在墙上的菜单，已经忍不住流口水了。<br>&emsp;&emsp;“主要是劳累了好半天，脑子还没缓过来，肚子也不是很舒服——当然不是要上厕所——也不知道吃什么，我看你这么有精神，那你自己先点你的吧。”<br>&emsp;&emsp;服务员微笑着拿出来菜单，递给孜岚。<br>&emsp;&emsp;“额…那我要这个，这个，还有这个，对了，再加上这个。既然纳良不舒服，给他点一点这个吧。”<br>&emsp;&emsp;“好的,先结帐吧,一共是2个黄爪币。”<br>&emsp;&emsp;“孜岚，你可真会挑，给我点的饭花的钱仅占了全部的7%。”等饭菜上桌后，纳良看着一桌子的菜，不知道说什么。<br>&emsp;&emsp;“哎呀，这不是你说的你不想吃什么吗，我觉得这个就不错啊，白菜粉丝汤一碗就那么几块。”孜岚微微吐出他的舌头。<br>&emsp;&emsp;他把其中一个红爪币给了服务员。服务员惊讶地但是及时调整表情，点了点头就走了。<br>&emsp;&emsp;没过多久，该上的都上好了，当然还有退回来的零钱。纳良已经饿了好久，见到饭已经全部上来了也不装了，狼吞虎咽地开吃。<br>&emsp;&emsp;“咳咳！咳！咳咳！”<br>&emsp;&emsp;“喂，慢点，别呛到了！”孜岚连忙拍着纳良的背说。<br>&emsp;&emsp;“那我就不客气啦，开动！”孜岚也开始吃了。<br>&emsp;&emsp;……<br>&emsp;&emsp;吃饱后,他们在四周逛了逛。现在兽倒是没那么多了，确实在夜晚不好看风景，他们就找了一个大旅店住下了,你还别说，旅店的环境还是十分不错的，该有的都有，他们选了一个大的房间。当然钱也是真贵…<br>&emsp;&emsp;“不过孜岚这么有钱，稍微奢侈一回也没事吧。”纳良进门时小声说。<br>&emsp;&emsp;“纳良，我可听到了哦！要不然，你睡地板？”<br>&emsp;&emsp;“别别别，我开玩笑的！都是朋友。”纳良长吁一口气。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&amp;emsp;&amp;emsp;孜岚甩甩头，想要把头上的水甩掉。&lt;br&gt;&amp;emsp;&amp;emsp;“什么情况？你不是失忆了吗？”纳良说。&lt;br&gt;&amp;emsp;&amp;emsp;孜岚一脸懵，他大张着嘴巴，歪着头看着纳良，说：“什么失忆，我有失过忆吗？纳良，咱现在在哪啊？你不是要我搬家来着，我记</summary>
      
    
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/categories/furry-said-claw-truth/"/>
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/tags/furry-said-claw-truth/"/>
    
  </entry>
  
  <entry>
    <title>兽言爪道-第三章-小心！</title>
    <link href="https://blog.jiyu134.top/posts/ee6a/"/>
    <id>https://blog.jiyu134.top/posts/ee6a/</id>
    <published>2024-08-22T11:48:00.644Z</published>
    <updated>2024-08-22T11:48:00.644Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;&emsp;昨天半夜风开始变大，刮了一晚上的风，今天风居然更大了。<br>&emsp;&emsp;“啊，毛发又被吹乱了，可恶！喂，孜岚起床了！别睡了，快点整理东西,吃完饭就走，我可不会惯着你。”纳良走进帐篷，把孜岚摇醒，孜岚叫了一声后十分十分勉强地睁开眼睛。<br>&emsp;&emsp;纳良早就已经将他自己的东西收拾干净了，他拿了一杯水，把篝火最后的火苗熄灭，确定没有火星后，又回过身子看着下身裸的孜岚。<br>&emsp;&emsp;“喂，别看着我，我害羞…”孜岚正在穿下身衣服，看到纳良看着他，使劲用衣服捂住下面，脸稍微红了点，绷不住地叫道。<br>&emsp;&emsp;“那你快点。”纳良一脸不耐烦的样子很…可爱？<br>&emsp;&emsp;孜岚笑了笑，纳良还是很和善的——他坚信不疑。<br>&emsp;&emsp;他快速穿好衣服，草草地吃了早饭——是个快过期的凉罐头，居然连加热也没。他傻眼了，心里想：“难不成…昨天晚上我吃的是…纳良！！！”<br>&emsp;&emsp;而纳良也只是吐了吐舌头，就继续看向远处了。<br>&emsp;&emsp;“他，不会穷到这种地步了吧…等到了不管啥村子里我一定要好好休息一下，吃顿好的。居然要我吃快过期的罐头，他真是活腻了！”<br>&emsp;&emsp;孜岚想想，快过期又不是已经过期了，吃了估计也没事，打开口之后迅速地把它吃完，再把余下的物品需要装的都装好后，叫纳良继续出发。<br>&emsp;&emsp;纳良看到孜岚已经准备好之后把地图拿了出来。<br>&emsp;&emsp;“嗯，让我看看啊…接下来径直向北走一百二十千米有一个小村子，差不多2个多小时就到了，我们可以在那地方稍稍停留一会儿。”<br>&emsp;&emsp;孜岚看看远处，说：“你带够水了吗？我之前忘问了。”纳良又不耐烦地说：“带了带了，赶快走吧…”孜岚信任他，也就没再看。<br>&emsp;&emsp;孜岚在路上思考了一下，纳良算的这2个多小时不是奔跑速度嘛，他们这一路都在走，估计要远远大于2个多小时了。<br>&emsp;&emsp;他们走了几个小时，时间他们已经不管了。但是，现在太阳快到头顶了。<br>&emsp;&emsp;“不行了！哈!哈!真的好热啊。”孜岚实在是坚持不下去了，他跪在地上，不想再起身。他将舌头吐出来散热，拿出口袋里放的卫生纸来擦身上的汗——毕竟汗已经对他的毛进行了多重打击，实在是熬不住了。<br>&emsp;&emsp;“那，先找阴凉地休息会吧，正好我也累了。”纳良也坐下，看着孜岚，然后帮他擦汗。<br>&emsp;&emsp;稍微歇了1分钟后，孜岚站起来，找了一个看起来十分高大的树，把包放下后就再次躺在地上一动不动。<br>&emsp;&emsp;“让我喝点水，孜岚，把我的包拿过来。”纳良实际上也已经扛不住了，对着孜岚说。“好，我先看看啊…”孜岚把包拿到爪里，肉垫的摩擦让书包不会滑到地上——虽然本来书包就不会掉下来。他打开书包，准备拿出一瓶水，但里面…只有一瓶水，完全不够喝。他十分惊讶地大叫道：“等下，就…就一瓶水！啊？纳良！！！”<br>&emsp;&emsp;“呃，我估计是忘了。诶嘿~”纳良听到这个消息，在那一刹那他害怕了，但又很快转变成平静的样子，孜岚已经不知道该说什么了。<br>&emsp;&emsp;“我不是说了让你检查一下吗！那现在怎么办？”<br>&emsp;&emsp;“呃，对不起…”纳良低着头说，好吧，看起来他像是在诚恳地道歉。<br>&emsp;&emsp;“你这…算了，我不说啥了。我歇够了，再往前走吧，说不定有河呢。”<br>&emsp;&emsp;没想到，真的被孜岚猜中了，不远处真的有一条河。<br>&emsp;&emsp;“哇，幸好有河，不然我就得渴死了。我去装点水，你去吗？”孜岚问纳良。其实他还是很期待纳良去的，这样的话就可以半路上直接跑路，以拉肚子的名义——但这个计划貌似实现不了了。<br>&emsp;&emsp;纳良摇头说：“你自己去吧，我再歇一会。”<br>&emsp;&emsp;好吧，看来纳良并不想去。孜岚无奈的拿出容器，向那河流走去。<br>&emsp;&emsp;想要到达河流边，需要小心地从滑坡上滑下去——不是悬崖就已经很不错了。不过好说的是，滑坡上还是有很多可抓的地方。<br>&emsp;&emsp;孜岚走到斜坡边，十分谨慎地往下滑。纳良就坐在原来的那棵树边，看着他这个动作，嘴边漏出一丝笑容——难不成，他是故意的？<br>&emsp;&emsp;但是意外发生了，孜岚一个不小心，被斜坡的一颗小石子给绊倒了，他一路滑到河里，那河很是湍急，孜岚就被冲走了！<br>&emsp;&emsp;“孜岚！卧槽！”<br>&emsp;&emsp;孜岚浮在水面上，被河流带走着，纳良背好包，跑了起来。<br>&emsp;&emsp;“坚持！等等，小心！”<br>&emsp;&emsp;河的前面是一根横倒着的树。<br>&emsp;&emsp;“快躲一下，往水下游。”纳良大喊。<br>&emsp;&emsp;可是这个时候的孜岚根本听不见，周围只有水声。但他注意到了那棵树。用自己的爪子抓住了树干。<br>&emsp;&emsp;树被拖了十几米后停了下来——原来是纳良支着树。<br>&emsp;&emsp;孜岚一点一点向岸边靠去，但水冲他让他很难把控好重心。一不小心，一块来自上游的中等大小的石头砸中了他的头。<br>&emsp;&emsp;“嗷！”<br>&emsp;&emsp;就在此时，纳良伸出手，抓住了孜岚。孜岚成功上岸。<br>&emsp;&emsp;纳良脚下已经出现了很明显的坑，他现在是满头大汗，毛发有的都完全黏在一起了。<br>&emsp;&emsp;“总算是…平安无事。”纳良大喘气，孜岚倒在地上，晕了过去，不过是有呼吸的。真的是累坏他们了。不过结局是好的，毕竟…如果纳良再不抓的话，孜岚就会从瀑布上掉下来。肯定会摔个骨折。<br>&emsp;&emsp;“喂！孜岚，醒醒！”纳良大声呼唤他。很快，孜岚醒了过来。<br>&emsp;&emsp;但是，孜岚却用奇怪的眼神看着纳良，说：“诶？纳良，你怎么在这，我身上怎么这么湿，这又是在哪啊？”</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&amp;emsp;&amp;emsp;昨天半夜风开始变大，刮了一晚上的风，今天风居然更大了。&lt;br&gt;&amp;emsp;&amp;emsp;“啊，毛发又被吹乱了，可恶！喂，孜岚起床了！别睡了，快点整理东西,吃完饭就走，我可不会惯着你。”纳良走进帐篷，把孜岚摇醒，孜岚叫了一声后十分十分勉强地睁开眼睛。&lt;b</summary>
      
    
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/categories/furry-said-claw-truth/"/>
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/tags/furry-said-claw-truth/"/>
    
  </entry>
  
  <entry>
    <title>兽言爪道后记</title>
    <link href="https://blog.jiyu134.top/posts/4fkr/"/>
    <id>https://blog.jiyu134.top/posts/4fkr/</id>
    <published>2024-08-21T01:17:11.953Z</published>
    <updated>2024-08-21T01:17:11.953Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;&emsp;你好！我的读者朋友，我是《兽言爪道》的作者激鱼，我很高兴你能看完这本书（除非你倒着读这部分，那当我没说），和我一同见证了孜威和他的朋友们的故事。<br>&emsp;&emsp;本书于前年（二〇二二年）开始执笔——发表是在去年，一直到今年六月初第四部分初稿结束，期间断断续续才完成了本书的二分之一（或者可以加上“不到”二字）。封面，插图，剧情设计，人物构思等均由我一人完成。<br>&emsp;&emsp;在写本书之初，我也仅仅抱了一个能把“孜威”这个角色的世界观大致写出来完事的想法，也不指望能写出什么感动的故事，也不指望文笔有多么好，但即使这样，现在看来，我都有些不敢想象我接下来的精神状态是怎样的（想发癫…），或者说都有点不太想拿出手来给你看。嗯…我记得第一部分已经不知道修改了几遍了，初稿里面的片段可以给你摘出来一段。</p><p>&emsp;&emsp;回到椰树下，他缓了一下开始观察自己,在他站立时有一种莫名的陌生感。站起来往海边看一个身高较高，体型偏瘦的蓝瞳灰白色狼兽人出现在眼前。他洗了把脸，试图清醒过来“不，是凉的，难道…我穿越了？</p><p>&emsp;&emsp;虽然已经不知道是什么时候写的，不过这也算是最初的版本了，这是第一部分的序章的其中一段，当时那序章仅仅269个字（可见当时的我有多么随意…），现在的已经超过1000字了，真的有了不小的进步。<br>&emsp;&emsp;然后，在我不停的处理之后，算是马马虎虎地完成第二部分了。我还说两个部分就写完了，等到那个位置才发现还不行，但是我又懒，就又推迟了好几个月。去年末，我开始努力着手于第三部分，第四部分是紧接着第三部分完成的，但又出于修正第三部分，导致第四部分完成有点晚。其实第四部分的结尾我一直在犹豫要不要这么写，虽然说这么写对孜威没有什么大的影响，但是写了，可能会更增加丰富度吧。又是几个月过去，伴随着第四部分的结果，悬着的心终于放下了，但是，这还没有结束。<br>&emsp;&emsp;在创作新内容的同时，我也在对之前的内容进行更改，无论是在什么地方，无论大还是小，它们总是让我如此头疼。在写后记的时候，已经开始着于对文章的语言进行修整，对大局进行细微修改的地方了。说实在话，这个地方才是是难的一步。我曾经还对“将来的我”（也就是现在写后记的我）立下flag，但是这个flag可不是那么好实现的啊！<br>&emsp;&emsp;很感谢一位朋友给我提出的一些意见。如果说自己独立完成而不参考其他的观点，那么这本小说就是失败的。当然在这里也十分感谢其他帮助我的人啦。<br>&emsp;&emsp;我于今年七月十二日开始，对过去的东西进行修正。计划是在暑假结束（八月二十八日）前完成。但是估计够呛，我计划怎么也得出个二稿吧…<br>&emsp;&emsp;创造一个东西远比欣赏一个东西困难，但欣赏一个东西有的时候并不简算。如果我猜，估计没几个人能把这本书看完（你能看到这里，说明你真的很认真，很负责任，给你一个赞），但我该说还是要说的。<br>&emsp;&emsp;都说人一开始是一张白纸，学习新东西相当于在给它上色。我不是很喜欢在有事或者空闲时间看小说，一般喜欢在想摸鱼但是不能玩的情况下才会去看（例如我这个后记初稿就是在自习摸鱼的时候有感而写）。明年我要高考，说不定写小说可能会在考试的时候运用上呢（哪怕就一分…）当然，不仅仅用于高考，哪里说不定会用得上呢<br>&emsp;&emsp;我学习一些新东西来丰富自己，并呈现于书中，写给你。在无知中成长，在茫然中迈出第一步是困难的。欣赏一个东西，要从多方面去看，要仔细去琢磨。有的时候这个过程十分痛苦，但这个过程往往又是不可或缺的。<br>&emsp;&emsp;咳咳，说回书中。有人可能会说：主人公死去后又复活在新的星球（指在迪卡尔星中），上来就这么富有，你这不是在给没有行事能力的人传达错误的思想吗？还有战争，你这都是老套路了…<br>&emsp;&emsp;我并不觉得（先说好，这个问题你不一定会有，这里还是说了）。首先，但凡能看到这本书的人，或多或少知道“人死不能复生”这个道理吧。小说的内容是虚构的，是与现实不同的。这里我先大致说一下，下第二段再接着说。关于钱的问题，在故事中，主角和其他朋友都没有因为某个家庭富有而阿谀奉承，去想要讨好来得到好处，他们愿意为别人而付出自己，而钱是不影响他们的关系的。<br>&emsp;&emsp;谈及剧情，在这个世界中，尽管在主角身边确实发生了战争的情节，一开始我也没打算写出来打仗的一些故事，但是转念一想，孜岚离开家去旅行，帮助其他人，写出来战争实在是太合适了。或许老套…我认为倒是没啥，毕竟战争什么的，有的时候再正常不过了，它能提高人物之间感情链接，还有体现他们的一些精神。或许我也可以借此，写出点有意思的东西。况且，“我们又不曾想过自己能过上和平安宁的生活呢？”<br>&emsp;&emsp;人生只有一次，没有再来的机会。我给予了孜威一个新的生活，一个与之前完全相反的生活。我想突出一个反差。生活在地球的你，估计或多或少对自己身边的快生活所累，有压力，有竞争。我们虽然改变不了现实，但我们可以想象，有一个世界，有着自己热爱的东西，有自己愿意一辈子干下去的事情，有一个虽然累，但是我们很开心的生活，我们可以发挥自己的野性，释放自己，写下自己的精彩故事，描绘出一个“埃菲尔铁塔”出来。我们生活在这择一个快生话下，难道不能对另一个生活有些自己的想法吗？<br>&emsp;&emsp;我后来写这本书时还有一个目的，那就是展示自己的内心。每个人的性格是不一样的，不知道你能不能从书中看出来我什么（当然不要硬看啦）。我可能会把任务撇一边不敢，但我得承认我没有在逃避困难，即使我会抱怨，可是，那是我的工作，我不干谁来干呢？<br>&emsp;&emsp;本书作为我的处女作，第一次能把它拿出来给你看已经很不易了。我还记得我上四年级（2016年）的时候，我和一个很好的朋友开始在一起写小说（别想了，早就没了，我也不记得我写了什么），虽然写的有点失败，但还是很开心。或许我《兽言爪道》也有这方面的原因？<br>&emsp;&emsp;是爱好让我们在这里相遇。而你也可以看到，这本书除了激鱼，原来的孜威和一些配角外，绝大多都是兽人。因为我喜欢他们啊！从小我接触到一些动画，就逐渐喜欢上了它们，这也许是我与别人有时候无法交法的原因之一吧）。<br>&emsp;&emsp;但我当时对他们都没什么具体的定义，直到二〇二二年，我在网上看到了@TommyCrash的视频，认识到了“Furry”文化，我很开心，这里有我所喜欢的东西。我想成为一分子（虽然说只要喜欢就可以了），我开始试图站出一个平台来，想让别人知道我，理解我，可…我在学校里，每当我向他们展示这些时，他们有些会选择中立（因为根本一开始不了解这个圈子），有些则十分反感，“怎么又是这个？”。我当时也有些伤心。但我后来明白了，只要我心中有心，这就够了。我写这本书也算是在我心中创造了一个新的天地，一种动力。每每我想起来时，我会开心，我会激动，我会有信心。或许我可以说，我为它付出我的心血，是值得的。<br>&emsp;&emsp;在后面修正书的过程里，我有时会依靠音乐来提高我在对整个剧情的理解。这个理解并不是给读者用的，是为了提升作者的感官效益而用。例如在第二部分结尾，我循环了一首歌不知道多少遍，但是效果确实不错（自认为）。我有一天，我翻到我的收藏夹，发现了July的Beyond The Memory，我承认我确实再次绷不住了，8月11日那天我完成了第四部分的结尾，实在是不知道该说什么了，心里一阵酸，就好自己带入了角色之中，好像自己…<br>&emsp;&emsp;抱歉，让我冷静一下…<br>&emsp;&emsp;接下来，我还想再说些我的感慨，如果你有耐心，可以看看。<br>&emsp;&emsp;无论是在地球，还是在迪卡尔星中，每个个体都有其价值、无论是好是坏。他们或多或少都推动了故事的发展，推动了个人的人生方向。<br>&emsp;&emsp;每个人的故事是独一无二的，出于各种原因（外在的和内在的）。人，就像是指纹一样，这也就说明了每个人的性格不同，看待事物的不同。<br>&emsp;&emsp;我曾想过这个问题，我是什么样的？自己是永远不可能准确的回答这个问题。有时你认为自己的所作所为是应当的，是理所当然的，但经过沉淀，见的多了，可能会觉得自己错了。我还记得有段时间，因为一些小问题，我伤心了很久，但当别人听到这个事时，告诉我这不算啥，可是它多少还是对我影响了一些。不过放心，我缓过来啦！嘻嘻。<br>&emsp;&emsp;但无论如何，这也是你所应该做的（这里指你已经做过的，是过去式，并不是现在进行或者将来），也是你成长的反映，是你个人独一无二的体现，是你故事里的一处伏笔，或是个人细节描写。总之，世上没有绝对好坏，错事也不见得绝对的错。<br>&emsp;&emsp;人生的转折点，有时是那么明显，有时又是那么不可见。<br>&emsp;&emsp;“命运的齿轮开始转动”这类说法，是可以存在的，没错。但命运真的可见吗？你知道你的未来会是什么样子吗？你知道某一件事成功龙能不能改变未来，就算的可以，你又知道未来会不会有什么新的问题与之对冲？不知道。都说占卜能预测命运，或许，也只能做个骗子而不能当真了。命运就是一条直线。你不能做到双腿站在不同的分支上，那是肯定做不到的。（如果你说那“或”这个词不就是了吗，那应该变成了“是”和“否”了吧…）<br>&emsp;&emsp;你的故事，即为你的专属命运，你的选择决定了分支是什么，不要抱侥幸心理，专注地走好自己的故事。<br>&emsp;&emsp;最后，送你一句话：<br>&emsp;&emsp;在这变幻的世界，你我的存在都值得被肯定！<br>&emsp;&emsp;谢谢你，我的朋友。<br>&emsp;&emsp;&emsp;&emsp;2024年6月29日第一稿<br>&emsp;&emsp;&emsp;&emsp;同年7月13日第二稿；同年7月31日第三稿；同年8月9日第四稿<br>&emsp;&emsp;&emsp;&emsp;同年8月12日第五稿</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&amp;emsp;&amp;emsp;你好！我的读者朋友，我是《兽言爪道》的作者激鱼，我很高兴你能看完这本书（除非你倒着读这部分，那当我没说），和我一同见证了孜威和他的朋友们的故事。&lt;br&gt;&amp;emsp;&amp;emsp;本书于前年（二〇二二年）开始执笔——发表是在去年，一直到今年六月初第四部分</summary>
      
    
    
    
    <category term="furry said paws truth" scheme="https://blog.jiyu134.top/categories/furry-said-paws-truth/"/>
    
    
    <category term="furry said paws truth" scheme="https://blog.jiyu134.top/tags/furry-said-paws-truth/"/>
    
  </entry>
  
  <entry>
    <title>兽言爪道-第二章-第一个夜晚</title>
    <link href="https://blog.jiyu134.top/posts/71bf/"/>
    <id>https://blog.jiyu134.top/posts/71bf/</id>
    <published>2024-08-21T01:13:20.753Z</published>
    <updated>2024-08-21T01:13:20.753Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;&emsp;他们从屋子里出来后，纳良将门锁上。<br>&emsp;&emsp;再次看着这小屋，突然有了些许亲切感。<br>&emsp;&emsp;“你再检查检查，看看拿全了吗？”孜岚背上包，问他，他不想遗漏任何东西，就像那张照片一样。<br>&emsp;&emsp;“没了，走吧。”纳良点点头。孜岚明显感觉他的态度有些变化。<br>&emsp;&emsp;“对不起…”孜岚拍了拍他，安慰他，“怪我了，说错话了。”<br>&emsp;&emsp;纳良看了看他，突然微笑起来，说：“没事，是我的错，你失忆了，我得理解。嗯…”纳良先一步出发了，他连忙跟上。<br>&emsp;&emsp;“但愿没事…”<br>&emsp;&emsp;……<br>&emsp;&emsp;他们穿行在茂密的森林中，夜色中的树木静静地伫立在两侧，枝叶在微风中轻轻摇曳，发出沙沙的低语。月光透过树梢，斑驳陆离地洒在地面上，形成一片片光斑。偶尔，一阵清风掠过，吹动他们的毛，他们不得不再次整理。<br>&emsp;&emsp;他们继续前行，孜岚好奇地问：“纳良，我们为什么不选择坐交通工具呢？这样不是更快吗？”<br>&emsp;&emsp;纳良回答道：“因为……我想感受大自然嘛……好吧，其实是因为我没有多余的钱了，所以我才需要去找工作……”<br>&emsp;&emsp;孜岚的手已经伸向了口袋，他想要掏出一些钱来，但最终还是没有这么做。他懒洋洋地拍了拍纳良的肩膀，说：“我这里有钱，要不我们还是省点力气吧……”<br>&emsp;&emsp;纳良轻轻咳嗽了一下，似乎有些尴尬，但还是坚定地说：“其实，我们现在走的这条路是最快的。如果你选择坐交通工具，可能还没有我们步行来得快……所以，我们还是赶紧走吧，眼看着天都黑了。”<br>&emsp;&emsp;孜岚点了点头，这样，或许能更好的观察这个世界。他们继续在夜色中前行，两人的脚步声在寂静的夜空中回响，显得还是太安静了。<br>&emsp;&emsp;在森林的掩映下，他们找到了一块相对平坦的空地，决定在这里扎营。<br>&emsp;&emsp;纳良熟练地从背包中取出帐篷，孜岚则在一旁帮忙，两人配合默契。<br>&emsp;&emsp;最终，两个帐篷算是搭好了。<br>&emsp;&emsp;……<br>&emsp;&emsp;“我去找些吃的，你在这里等着我，不要乱走哦。”纳良离开了一会。孜岚看着刚生起的篝火陷入了沉思。<br>&emsp;&emsp;篝火烧的还算旺，他贴近火，有点热，就又后退了几步。他从周围找了块朽木，小心地搬过来放到篝火旁边，坐上去。周围是一篇森林，但没兽。在这荒郊野岭的，孜岚有点担心万一…冒出来个什么坏蛋，那可怎么办？<br>&emsp;&emsp;不过自己旁边有一根大棒子——在走的过程中捡的。当时…<br>&emsp;&emsp;“哇，快看，这个棒子可以做武器诶！”孜岚看见一棵树下有个粗糙的棒子，把它拿过来给纳良看。<br>&emsp;&emsp;“这你要带？你又不是小孩子。”<br>&emsp;&emsp;“那又怎样？我喜欢，我就带！”孜岚吐出舌头。<br>&emsp;&emsp;“好好好，你随便，我不管你。”<br>&emsp;&emsp;……<br>&emsp;&emsp;或许拿上这个可以让孜岚不害怕吧，他有武器，管谁来了给他一锤，根本没有反抗的余地。“哎！”他长吁一口气，开始发呆想事。<br>&emsp;&emsp;“我为什么会失忆啊？就很难理解…<br>&emsp;&emsp;“纳良，性格还挺好的，我很喜欢他。<br>&emsp;&emsp;“一些记忆碎片在我的脑子里，但是怎么拼也拼不起来…<br>&emsp;&emsp;“真是难搞呢…”<br>&emsp;&emsp;孜岚沉思的时候，旁边的草丛动了一下。<br>&emsp;&emsp;“谁？”孜岚扭头，喊道。<br>&emsp;&emsp;他起身，走进草丛一看。然而，除了微风拂过草丛的沙沙声，他什么也没有发现。不过却有一张纸条，上面写着：<br>&emsp;&emsp;希望你能原谅我，我亏欠了你这么多年，深感抱歉！<br>&emsp;&emsp;纸条上的字迹显得有些潦草，孜岚心中涌起一股莫名的情绪，他不知道这张纸条的来历，也不知道它所指的“亏欠”和“抱歉”究竟是什么。孜岚回到篝火旁，一个兽，看不清是谁，往他这里走来。他手里拿的，好像是棍子。<br>&emsp;&emsp;“我靠，不会是…”孜岚拿起大棒子准备随时迎击。<br>&emsp;&emsp;“喂，不是我说，你还拿着这棍子干什么，不嫌碍事吗？”<br>&emsp;&emsp;这声音是…纳良！<br>&emsp;&emsp;“哇，你刚刚可吓我一跳！”<br>&emsp;&emsp;纳良看着他，用一种鄙视的眼神。原来那棍子只是插着鱼的木棍。<br>&emsp;&emsp;“刚捕的，新鲜的很，等熟了你尝尝。”孜岚看到鱼，高兴地点头。<br>&emsp;&emsp;……<br>&emsp;&emsp;过了一小会，鱼烤好了。鱼散发着美味的味道，让他们直流口水。<br>&emsp;&emsp;“哇，确实很好吃啊！”孜岚两眼发光。<br>&emsp;&emsp;“是吧，我做鱼还是可以的，练了这么长时间怎么得有点效果。”纳良拿起最后一串鱼，开始啃了起来。<br>&emsp;&emsp;“喂，给我剩一点，我还没吃饱！”<br>&emsp;&emsp;纳良笑着说：“要不，你吃包里我放的那罐头？”他打开背包，拿出一个肉罐头递给孜岚。<br>&emsp;&emsp;孜岚犹豫了几秒，秉着不吃就亏了原则，还是极不情愿地接过罐头。<br>&emsp;&emsp;他接过罐头，打开盖子，一股浓郁的肉香扑鼻而来，他流出来一点口水。<br>&emsp;&emsp;“这个罐头啊，其实也就那样，没什么好吃的。”孜岚故作轻松地说，同时把罐头放在一边，仿佛它并不是什么诱人的食物。<br>&emsp;&emsp;纳良微微一笑，似乎看穿了孜岚的小心思，但并没有点破。他只是轻轻地说：“如果你真的不感兴趣，那我就吃了。”<br>&emsp;&emsp;孜岚连忙抓住罐头，背过身来。“喂，我说，你这尾巴…很诚实啊。”<br>&emsp;&emsp;纳良笑了，孜岚回头一看，这尾巴摇的厉害。<br>&emsp;&emsp;“行了孜岚，好好吃，我又不会抢。”他也笑了，狼吞虎咽地解决了罐头，就进帐篷了。<br>&emsp;&emsp;……<br>&emsp;&emsp;“哎~”纳良长叹了一下，自言自语道：“真是拿他没办法呢。明天，又会是怎样呢？哎，不想了，睡觉。”<br>&emsp;&emsp;纳良对孜岚不放心，本来麻烦就够多了，孜岚这么一失忆，让他对孜岚有些不放心了。他想是等孜岚睡着后再进他的帐篷里睡，生怕吵醒他。<br>&emsp;&emsp;在一切睡前工作完成后，孜岚把他背的那个书包放在帐篷里，拿出包里的镜子开始打量自己。<br>&emsp;&emsp;“我还挺帅的，嘻嘻。”<br>&emsp;&emsp;纳良在外面看了他一眼，说：“我该说你自恋呢，还是说些什么呢？”<br>&emsp;&emsp;“呃…”孜岚想着必须赶紧换个话题，他突然想起来了那个纸条。“对了，这纸条…”他把它展示给纳良看。<br>&emsp;&emsp;“大概是什么淘气的兽鬼鬼祟祟的搞事情吧，别理它就行了，像你这样的很容易的…”纳良连看都没看就回了他这么一句。<br>&emsp;&emsp;“好吧，睡吧，累了。”<br>&emsp;&emsp;孜岚躺下来，尽管他试图放松，但思绪纷飞，让他难以入睡。他辗转反侧，心中充满了对未来的疑惑和对过去的迷茫。<br>&emsp;&emsp;“所以…那到底是什么意思呢？”孜岚自言自语，试图理清心中的困惑，但记忆的空白让他无法将这些片段拼凑成完整的画面。<br>&emsp;&emsp;他闭上眼睛，深呼吸。夜风穿过帐篷缝隙，带来一丝凉意，也带来了夜的宁静。孜岚渐渐地放松了，他的思绪开始飘散，慢慢地进入了梦乡。<br>&emsp;&emsp;希望，一切都好。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&amp;emsp;&amp;emsp;他们从屋子里出来后，纳良将门锁上。&lt;br&gt;&amp;emsp;&amp;emsp;再次看着这小屋，突然有了些许亲切感。&lt;br&gt;&amp;emsp;&amp;emsp;“你再检查检查，看看拿全了吗？”孜岚背上包，问他，他不想遗漏任何东西，就像那张照片一样。&lt;br&gt;&amp;emsp;&amp;ems</summary>
      
    
    
    
    <category term="furry said paws truth" scheme="https://blog.jiyu134.top/categories/furry-said-paws-truth/"/>
    
    
    <category term="furry said paws truth" scheme="https://blog.jiyu134.top/tags/furry-said-paws-truth/"/>
    
  </entry>
  
  <entry>
    <title>兽言爪道-第一章-搬家</title>
    <link href="https://blog.jiyu134.top/posts/6613/"/>
    <id>https://blog.jiyu134.top/posts/6613/</id>
    <published>2024-08-21T01:05:59.267Z</published>
    <updated>2024-08-21T01:05:59.267Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;&emsp;时间已经过去了不少，但还不至于那么快到天黑。他走了一段泥土小路，总算是看见了那个村子的大致轮廓。<br>&emsp;&emsp;从远处望去，这个村子规模不大不小，住的兽[ ]也不多。他走进村中，发现在这里可以见到各种奇奇怪怪的椰子，香蕉等水果，或者粮食，肉类。<br>&emsp;&emsp;“做成这个样子，大概是为了吸引买家购买吧，不过，这有些样子…我还真想买来看看，可是我口袋里又没钱…算了，不管怎样，先解决饮食问题吧。”<br>&emsp;&emsp;因为他失忆了，对这里不熟悉，所以也不敢和其他兽说话，哪怕有兽大声称呼他孜岚，他也不敢回应，只能笑一笑快步跑走。<br>&emsp;&emsp;“啊，我到底要不要开口呢？”他有些害羞，总不能遇见一位就躲吧。<br>&emsp;&emsp;向村子中心走去，他更加紧张了。甚至腿都开始抖了起来。<br>&emsp;&emsp;“真的，我做不到…我到底去哪？”<br>&emsp;&emsp;……<br>&emsp;&emsp;也许这种情况并不会维持太久。他继续走，直到遇到了一位狐兽人。<br>&emsp;&emsp;橙色的毛皮让他想起了橙子，绿色的眼睛直视孜岚，让他有点紧张。<br>&emsp;&emsp;“不会又要…”<br>&emsp;&emsp;“哎呀！这不是孜岚嘛！等你好半天了。”<br>&emsp;&emsp;那兽打起了招呼，孜岚愣住了，随即想要离开，但是不行，那兽连忙拽住他，不让他走。<br>&emsp;&emsp;那兽狠狠地拽着他的衣服，说：“诶，你走什么？你不是要帮我干活吗？还有，天都这么晚了才赶过来，你好像…有点慢啊。”<br>&emsp;&emsp;这下子孜岚彻底尴尬了，他对面前的兽人完全不了解，根本接不了话。“我到底要干什么啊！怎么办？”他心想。没办法，只能硬着头皮说实话了。<br>&emsp;&emsp;“我失忆了，所以…你是谁？”他支支吾吾地说。<br>&emsp;&emsp;孜岚的这一句话直接把那兽问傻了，他先是睁大双眼，后又皱起眉头，把爪放在嘴边，装作深深思考的样子，沉默了好久。稍过了一会，那兽开口了：“孜岚，你确定？你没开玩笑吧…喂，你可别吓我！”<br>&emsp;&emsp;那兽晃着孜岚，想要晃醒他，但是这自然是不行的。<br>&emsp;&emsp;孜岚无力地回了一句：“我没吓你，我真的失忆了，我现在什么都想不起来。你是谁，我已经记不起来了…”<br>&emsp;&emsp;那兽看了看远处的天空，稍作镇定后说：“好…我叫纳(nà)良(liáng)，是你的好朋友，今年19岁。看，这个村子是我的家乡，但我马上就要到你家附近住了，因为我在那里找了一份工作…哎呀，总之先进到屋子里说吧。”<br>&emsp;&emsp;……<br>&emsp;&emsp;纳良把孜岚拉进屋子里，屋子里面空空的，只剩了一点点东西。<br>&emsp;&emsp;“我准备让你帮我搬点东西，正好路上无聊，你还能陪我说说话。我正准备今天下午就出发，本来是不等你了，最后你终于来了，接下来就不用我多说了吧。哎呀，搬东西真的很麻烦，又要搬到那么远的地方。”<br>&emsp;&emsp;孜岚问他要搬到哪里，他回答：极星国莞白城。<br>&emsp;&emsp;因为地图是不完整的，所以孜岚不知道它的具体位置。纳良从他的包里拿出一张地图——这张比较全——给他指了指。<br>&emsp;&emsp;极星国在整块大陆的最北端，距离还是有些远的，想要到达那里得费一些时间。他问起纳良这个地方怎么样，纳良说：“这是你的故乡，在那里一方面是找工作，另一方面也方便找你，比如一些任务，或者其他的事情。”<br>&emsp;&emsp;孜岚想了想，说：“那休息一下就出发吧，我也要回去，我看能不能通过这样的方式来找回我的记忆。”<br>&emsp;&emsp;他其实也不确定能不能成功——但毕竟还是要试试的，万一可以呢…<br>&emsp;&emsp;……<br>&emsp;&emsp;孜岚倚靠在墙边，将书包置于身前，开始仔细地翻查自己的背包——这次比以往更加细致。他注意到包里有几枚类似硬币的红色物品，在光线的映照下闪烁着光芒，显得颇为吸引人。<br>&emsp;&emsp;“喂喂喂！不过是搬个东西，你父亲怎么给了你这么多钱[ ]？”纳良看到后，露出一副惊讶的表情。<br>&emsp;&emsp;“这是钱吗？我还以为这是玩具呢。”孜岚拿起其中一枚硬币，继续说道，“我记得刚到这个村子时，大家都是用白色的这个东西来交易的。我翻包时还以为这些是玩具呢。所以说，这个的价值是多少？”<br>&emsp;&emsp;纳良沉思片刻，回答说：“大概…这些可以买到…1万瓶矿泉水吧。我说，你不会连这最基本的常识都忘的一干二净了吧。”<br>&emsp;&emsp;“啊？这么多？”孜岚惊讶地睁大了眼睛，他这辈子还没见过这么多钱——他的脑海里迅速闪过这个念头。<br>&emsp;&emsp;孜岚轻轻地将这些硬币放回书包，找到一个非常隐蔽的角落，小心翼翼地将它们存放好，仿佛生怕有兽会偷走到它们一样。<br>&emsp;&emsp;他把硬币放好后，深吸了一口气。<br>&emsp;&emsp;纳良看着孜岚这一系列谨慎的动作，忍不住笑了起来。<br>&emsp;&emsp;孜岚的脸颊微微泛红——尽管他脸上覆盖着毛，看不出颜色的变化，但温度的变化他还是能够感受到的。他低下头，轻声说道：“我的记忆中有些东西是我不了解的。真的很奇怪……”<br>&emsp;&emsp;“好了，现在最重要的事情是先回到你的家，以免耽误了什么事情。”纳良轻拍了拍孜岚的肩膀，孜岚又害羞地摇起了尾巴。<br>&emsp;&emsp;纳良走到门口，望了望外面的天色，然后说：“差不多了，该出发了。”<br>&emsp;&emsp;“啊？可是我们才休息了一会儿啊？”孜岚有些懒散，不太愿意这么快就动身。<br>&emsp;&emsp;“如果再不出发，天就要完全黑了，快走吧！这里可没有床给你睡觉，除非你想睡地板。”纳良帮他整理好行囊后，推着他走出了门。<br>&emsp;&emsp;孜岚只能跟随着纳良的步伐走了出来。然而，当他踏出门时，他注意到地上有一张照片。<br>&emsp;&emsp;“诶，这是……”他弯腰捡起照片，里面是纳良和一个他不认识的兽人。<br>&emsp;&emsp;纳良走过来，瞥了一眼。“啊，那是‘柴(chái)本(běn)’，我爷爷。”<br>&emsp;&emsp;孜岚注意到两个兽人的毛色截然不同，甚至种族都不一样。<br>&emsp;&emsp;“可是这，一个是狐狸，一个是熊……你不会是被他捡来的吧……”<br>&emsp;&emsp;“不是！”纳良显得有些激动，“不是这样的。”<br>&emsp;&emsp;或许孜岚的话有些让他伤心——尽管他并不知道。<br>&emsp;&emsp;“爷爷…”纳良表情有些不正常，但他还是背过身来，调整一下心情。<br>&emsp;&emsp;“没事吧！”孜岚连忙走过去，查看情况。<br>&emsp;&emsp;“没事…我还好。”孜岚多少有些后悔了，他不应该说的。<br>&emsp;&emsp;“好了，我们走吧。”</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&amp;emsp;&amp;emsp;时间已经过去了不少，但还不至于那么快到天黑。他走了一段泥土小路，总算是看见了那个村子的大致轮廓。&lt;br&gt;&amp;emsp;&amp;emsp;从远处望去，这个村子规模不大不小，住的兽[ ]也不多。他走进村中，发现在这里可以见到各种奇奇怪怪的椰子，香蕉等水果，或者粮</summary>
      
    
    
    
    <category term="furry said paws truth" scheme="https://blog.jiyu134.top/categories/furry-said-paws-truth/"/>
    
    
    <category term="furry said paws truth" scheme="https://blog.jiyu134.top/tags/furry-said-paws-truth/"/>
    
  </entry>
  
  <entry>
    <title>兽言爪道-序章-我是谁？</title>
    <link href="https://blog.jiyu134.top/posts/9a7a/"/>
    <id>https://blog.jiyu134.top/posts/9a7a/</id>
    <published>2024-08-20T21:03:40.000Z</published>
    <updated>2024-08-20T21:03:40.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note flat"><p>我们重新发了这本书<br>如果有兴趣想看之前未修改的内容<br>可查看下面的链接<br><a href="https://blog.jiyu134.top/%E6%97%A7%E6%96%87%E4%BB%B6.zip">https://blog.jiyu134.top/旧文件.zip</a></p><p>忙活了一个暑假，好累</p></div><p>&emsp;&emsp;我，为什么要来到这个世界呢？<br>&emsp;&emsp;我还…有忘不了的人啊！可是…<br>&emsp;&emsp;我已经没有机会和他说再见了…<br>&emsp;&emsp;谢谢你…<br>&emsp;&emsp;……<br>&emsp;&emsp;天空真的很蓝。和风带着海浪漂到了一处无名沙滩上，万里无云，确实是个好天气。如果没猜错的话，现在应该是当地时间下午4点。<br>&emsp;&emsp;太阳已经不再像正午那样刺眼了，各种东西的阴影都打在沙滩上，海水冲刷着沙子，将一些痕迹抹除。<br>&emsp;&emsp;沙滩上的椰子现在开的正旺，而在其中一棵椰子树的下面，躺着一个兽人。他发出缓慢的呼吸声。突然，椰子掉了下来，砸中了他的头。<br>&emsp;&emsp;“嗷!”<br>&emsp;&emsp;他被这椰子给砸醒了。他被这突如其来的疼痛感感到迷糊。<br>&emsp;&emsp;“唔，有点痛，什么东西…砸我头上了？”<br>&emsp;&emsp;他完全不熟悉他现在所处的环境，揉揉眼，歪着头，就好像什么也不知道一样。他看向自己的手——哪里是手，明明是爪子。<br>&emsp;&emsp;“什么鬼？”<br>&emsp;&emsp;他环顾了四周后尝试站起来，但很快又坐了下去，可能是不适应曲腿，他现在就像刚学会走路的小孩子一样。<br>&emsp;&emsp;“怎么…站不起来？”他有点迟钝地自言自语道。<br>&emsp;&emsp;他抬起头，向远处的海看去。那海不知道多大，反正是看不到边。他走到海边，透过水面观察着自己的样子：<br>&emsp;&emsp;他有着一身银亮发灰的皮毛，一对小小的兽耳在头上随风摆动，蓝色的眼睛很是漂亮，鼻端突出，有锋利的爪子——不过它们一般都会藏起来，不能显得太凶，万一吓到小孩子怎么办——弯曲的腿让他可以四肢行走，而且跑的更快，他的柔软的尾巴依旧是随风飘动。<br>&emsp;&emsp;“我这是…狼人？”他好像清醒了一些，轻轻将头伸进水里，闭上嘴巴，好让自己完全清醒过来。他狠狠地拔出头，用力地甩了甩，用爪子背面揉了揉眼睛，再次目视远方。<br>&emsp;&emsp;头上的毛已经被水浸湿了，但没关系，过一会就自然风干了——现在风有点大，风还夹杂着些许沙子。<br>&emsp;&emsp;“啊，沙子进我的眼里了。”使劲揉了揉眼，这才舒服些。<br>&emsp;&emsp;他不清楚自己是谁，来自何处，又要去何方，他真的什么也不记得了。他现在为了不让沙子进到眼里，狠狠眯着眼，倒是显得有些狼狈。他站起身来回过头，发现在他刚刚靠的那棵椰树边，有一个灰色大书包躺在地上。<br>&emsp;&emsp;他靠近书包并打开它，里面东西有点多，但大部分是日常用品，像是帐篷，零食，小刀等等。“这帐篷是可以装进去的吗？”<br>&emsp;&emsp;“欸，这是什么？”好像翻到了硬硬的，平面形的东西。他小心地拿出来，原来只是一张身份证而已，上面写着这个书包拥有者的身份：<br>&emsp;&emsp;&emsp;&emsp;孜(zī)岚(lán)，兽历662年4月26日[ ]出生，极星国莞白城居民<br>&emsp;&emsp;“我的名字是…孜岚？”这应该就是他的名字了，他的照片还在上面展示着，看来是无误了。<br>&emsp;&emsp;他放下身份证继续翻着，包里的夹层还夹有一张地图，不过只有一小块，看样子是随手不知道从哪里撕下的。尽管这样，他还是能通过这一小块看出来这是区域地图的一小部分。<br>&emsp;&emsp;他看过后把这些拿出来的东西再按原位放回去。<br>&emsp;&emsp;“不好了，天正在变黑，我不能在这里呆太久，我得看看现在我应该去哪里…”他看着地图，发现有一个应该是他自己画的，标有五角的地方。那里是个村子，叫“河源村”。<br>&emsp;&emsp;“那就去这里吧。”他背上书包，向那里前进。<br>&emsp;&emsp;走进森林之中，出于茂密的叶子挡住了阳光，使得走起路来多少看的不是很清楚，不过也能走。<br>&emsp;&emsp;“真是奇怪，我为什么会失忆呢？”</p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;note flat&quot;&gt;&lt;p&gt;我们重新发了这本书&lt;br&gt;如果有兴趣想看之前未修改的内容&lt;br&gt;可查看下面的链接&lt;br&gt;&lt;a href=&quot;https://blog.jiyu134.top/%E6%97%A7%E6%96%87%E4%BB%B6.zip&quot;&gt;htt</summary>
      
    
    
    
    <category term="furry said paws truth" scheme="https://blog.jiyu134.top/categories/furry-said-paws-truth/"/>
    
    
    <category term="furry said paws truth" scheme="https://blog.jiyu134.top/tags/furry-said-paws-truth/"/>
    
  </entry>
  
  <entry>
    <title>兽言爪道-第三十章-奇迹</title>
    <link href="https://blog.jiyu134.top/posts/huilai/"/>
    <id>https://blog.jiyu134.top/posts/huilai/</id>
    <published>2024-08-20T02:27:49.379Z</published>
    <updated>2024-08-20T02:27:49.379Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;&emsp;孜岚回到莞白城，回到他自己的家。孜豫正在沙发上看书。“回来啦！诶？孜威怎么没有跟你一起回来？”“爸…他…再也不可能回来了。”“啊？！到底发生什么了？”“他为了救我，牺牲了自己…现在已经找不到了。我抱有侥幸心理，想要再找，可是再找…哎。我先回屋了。”孜岚回到他的房间，趴在床上，一会就睡着了。<br>&emsp;&emsp;孜岚醒来，发现自己正在小屋的签名。门前坐的就是孜威。“诶，你愣着干什么。过来坐会儿。”<br>&emsp;&emsp;“孜威…”“你怎么哭了？咱不是已经完成任务了吗？”孜威想要抱住孜威，但他的爪却直接穿过了孜威的身体。“为什么…”“什么为什么？算了。任务已经完成了，我还有个小心愿你看能不能实现。”“什么愿望？”“我喜欢你，我好想…听一遍你的狼嚎啊”<br>&emsp;&emsp;孜威突然消失了，随即孜岚从梦里醒来，枕头都湿透了。<br>&emsp;&emsp;“当然可以，我会的。”<br>&emsp;&emsp;孜岚拿着之前拍的照片，冒着外面突然下雪的天气，跑到了一个山坡上。那个山坡上有颗千年老树，那是孜岚小时候玩游戏的地方。孜岚控制住自己的哭声，发出了几声凄惨的狼嚎。<br>&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;“嗷呜<del>嗷呜</del>”<br>&emsp;&emsp;那声音传了好几次都不见削弱，形成了好几个回音。<br>&emsp;&emsp;“孜威，你听到了吗？我也喜欢你！你回来吧！！！”<br>&emsp;&emsp;突然，一个好像流星的东西从远处飞过来。“那是什么？”那东西发着青光。等那东西落在地上的时候，一个兽人出现了，正是孜威。<br>&emsp;&emsp;“孜威！”“嗯…我这是在哪里？孜岚？”孜岚一把抱住了孜威。这正是：<br>&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;因为失去过，所以不想再失去啊。<br>&emsp;&emsp;“所以，你是怎么活下来的？”孜岚问他。<br>&emsp;&emsp;让我们把时间拉回一个小时前。<br>&emsp;&emsp;在孜威那边。因为巧妙的结构，使得孜威被小石头砸中晕了过去但没有被压死。等他醒过来的时候，水晶屏障就已经裂开了，里面是一个空间，里面有一个会发光的石头。<br>&emsp;&emsp;“一靠近它，我的身体就发光。当我拿起它的时候，他拉着我，飞到了这里。”“真是奇迹啊！”孜岚说。<br>&emsp;&emsp;“还有，你的狼嚎真的很响呢。嘻嘻！” 就这样，他俩拉着手回家，天边飞过一颗流星。路灯照到照片上，照片里的孜岚笑的更灿烂了呢。</p><p>《兽言爪道》第二部分 完</p><div class="note flat"><p>这里稍微带一下：<br>第三部分的框架已经打好了，但是什么时候出来还要过一段时间<br>快开学了，真的可能要断更了<br>我会出的<br>一口气把第二部分结束好累！</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&amp;emsp;&amp;emsp;孜岚回到莞白城，回到他自己的家。孜豫正在沙发上看书。“回来啦！诶？孜威怎么没有跟你一起回来？”“爸…他…再也不可能回来了。”“啊？！到底发生什么了？”“他为了救我，牺牲了自己…现在已经找不到了。我抱有侥幸心理，想要再找，可是再找…哎。我先回屋了。”孜</summary>
      
    
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/categories/furry-said-claw-truth/"/>
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/tags/furry-said-claw-truth/"/>
    
  </entry>
  
  <entry>
    <title>«与假书»</title>
    <link href="https://blog.jiyu134.top/posts/guezi/"/>
    <id>https://blog.jiyu134.top/posts/guezi/</id>
    <published>2024-05-07T09:10:22.174Z</published>
    <updated>2024-05-07T09:10:22.174Z</updated>
    
    <content type="html"><![CDATA[<p>写于2023年7月6日，当时学校延迟放假，天气特别热，就写了这篇文章。<br>仅供娱乐！</p><p>假好，吾今痛批当下学生处境，身心俱疲欲亡不得，欲血不得。吾真真不能忘假矣。遥想去年，雄站家，手持手坤，心爽神明。看今朝，月落鸟啼双满天，不能放假心难眠。时值考试来之际，心甚激，但闻噩耗，如失双亲，欲死如怎得高绩？<br>每忆此时，犹饮假酒，愿借此与假永别矣！泪湿书卷，字色已浊。纸短情长，唯恐不将吾之意尽为悲！转眼至七月，正时炎暑回味之时，学校近至四十二度几近烤焦，只可怜自己，空调无用严守热。呜呼，向使家长各爱其子女则可学三年可至百与而成才，但心散何谈三年乃一时不可存也。<br>十年以来除疫情排外，何不得准时如钯原子（意为准时）同？但此时无特况又为何让要与假长别？度一秒如一世纪何不为悲？攻克半年学习，为了长乐，君本应放假，为半年画上一个完美的句号，却都因此决推迟放假，这是人的大悲啊！<br>念前之情，心里多有复杂之感，此书也为有感兴发，有不解处，望回信表志，应把吾之意了解明了为好。<br>假期啊！ 望你，盼你，朝思夜明，无时无到不在想你。尽管此书可能语言杂乱，但身为不可与假期遇，心里复杂，无心无力。若能有一时可解心意，那便是吾之大愿罢<br>表我对们的有心无法至，思念甚大的心<br>怀念你的XXX<br>二〇二三年七月六日夜</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;写于2023年7月6日，当时学校延迟放假，天气特别热，就写了这篇文章。&lt;br&gt;仅供娱乐！&lt;/p&gt;
&lt;p&gt;假好，吾今痛批当下学生处境，身心俱疲欲亡不得，欲血不得。吾真真不能忘假矣。遥想去年，雄站家，手持手坤，心爽神明。看今朝，月落鸟啼双满天，不能放假心难眠。时值考试来之际，心</summary>
      
    
    
    
    <category term="学习" scheme="https://blog.jiyu134.top/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="学习" scheme="https://blog.jiyu134.top/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>兽言爪道-人物框架</title>
    <link href="https://blog.jiyu134.top/posts/heoa0/"/>
    <id>https://blog.jiyu134.top/posts/heoa0/</id>
    <published>2024-02-23T09:45:46.678Z</published>
    <updated>2024-02-23T09:45:46.678Z</updated>
    
    <content type="html"><![CDATA[<p>这里是《兽言爪道》人物汇总文章<br>地球上的2023年是兽历683年。</p><div class="tabs" id="人物"><ul class="nav-tabs"><button type="button" class="tab  active" data-href="人物-1">纳良</button><button type="button" class="tab " data-href="人物-2">莞荣</button><button type="button" class="tab " data-href="人物-3">莞源</button><button type="button" class="tab " data-href="人物-4">孜豫</button><button type="button" class="tab " data-href="人物-5">孜航</button><button type="button" class="tab " data-href="人物-6">柏根</button><button type="button" class="tab " data-href="人物-7">柴泽</button><button type="button" class="tab " data-href="人物-8">其他角色</button></ul><div class="tab-contents"><div class="tab-item-content active" id="人物-1"><p>纳良 雄 狐<br>出生日期：兽历664年10月9日<br>故乡：渊明国河源村<br>瞳色：绿色（GREEN）<br>是孜岚的朋友</p></div><div class="tab-item-content" id="人物-2"><p>莞荣 雌 狼<br>出生日期：兽历634年3月20日<br>故乡：繁枝国狄然城<br>瞳色：黄色（YELLOW）<br>是孜岚的母亲</p></div><div class="tab-item-content" id="人物-3"><p>莞源 雄 狼<br>出生日期：兽历659年1月21日<br>故乡：极星国莞白城<br>瞳色：黄色（YELLOW）</p></div><div class="tab-item-content" id="人物-4"><p>孜豫 雄 狼<br>出生日期：兽历629年7月5日<br>故乡：极星国莞白城<br>瞳色：黄色（YELLOW）</p></div><div class="tab-item-content" id="人物-5"><p>孜航 雄 狼<br>出生日期：兽历671年12月30日（2011年）<br>故乡：极星国莞白城<br>瞳色：左眼黄色（YELLOW），右眼绿色（GREEN）</p></div><div class="tab-item-content" id="人物-6"><p>柏根 雄 狼<br>出生日期：兽历662年8月2日（2002年）<br>故乡：繁枝国狄然城<br>瞳色：蓝色（BLUE）</p></div><div class="tab-item-content" id="人物-7"><p>柴泽 雄 狐<br>出生日期：兽历666年4月4日（2006年）<br>故乡：柴达城南柏城<br>瞳色：青色（CYAN）</p></div><div class="tab-item-content" id="人物-8"><p>黑胜资料不详<br>狂恒资料不详</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="anzhiyufont anzhiyu-icon-arrow-up"></i></button></div></div><p><img src="https://www.z4a.net/images/2024/02/23/-2024-02-23-182114.jpg" alt="-2024-02-23-182114.jpg"></p><p><img src="https://www.z4a.net/images/2024/02/23/-2024-02-23-183535.jpg" alt="-2024-02-23-183535.jpg"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;这里是《兽言爪道》人物汇总文章&lt;br&gt;地球上的2023年是兽历683年。&lt;/p&gt;
&lt;div class=&quot;tabs&quot; id=&quot;人物&quot;&gt;&lt;ul class=&quot;nav-tabs&quot;&gt;&lt;button type=&quot;button&quot; class=&quot;tab  active&quot; data-hr</summary>
      
    
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/categories/furry-said-claw-truth/"/>
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/tags/furry-said-claw-truth/"/>
    
  </entry>
  
  <entry>
    <title>下载器第二版！</title>
    <link href="https://blog.jiyu134.top/posts/degr/"/>
    <id>https://blog.jiyu134.top/posts/degr/</id>
    <published>2024-02-11T02:25:24.680Z</published>
    <updated>2024-02-11T02:25:24.680Z</updated>
    
    <content type="html"><![CDATA[<div class="note info simple"><p>代码参考了AI，使用了Python编程语言</p></div><p>因为一个小小的想法，我决定把之前的下载器再优化一下。</p><div calss='anzhiyu-tag-link'><a class="tag-Link" target="_blank" href="https://blog.jiyu134.top/posts/99c4">    <div class="tag-link-tips">引用站外地址</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="">          <i class="anzhiyufont anzhiyu-icon-link" style=""></i>        </div>        <div class="tag-link-right">            <div class="tag-link-title">下载器第一版</div>            <div class="tag-link-sitename"> https://blog.jiyu134.top/posts/99c4 </div>        </div>        <i class="anzhiyufont anzhiyu-icon-angle-right"></i>    </div>    </a></div><p>它实现了什么功能呢？<br>首先它可以实现联网在线获得链接，下载zip，png，jpg，exe格式文件（如果有需要我会再加入别的），在线检测版本这三个功能。<br>每当我更新了新功能我都会换版本<br>别看着简单，实际费了我4个小时，尝试了33次才完成的<br>下面是源码：</p><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">download_file</span>(<span class="params">url, output_path</span>):</span><br><span class="line">    response = requests.get(url)</span><br><span class="line">    <span class="keyword">if</span> response.status_code == <span class="number">200</span>:</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(output_path, <span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            f.write(response.content)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;成功下载到：<span class="subst">&#123;output_path&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;下载失败：<span class="subst">&#123;url&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_file_lines</span>(<span class="params">url</span>):</span><br><span class="line">    response = requests.get(url)</span><br><span class="line">    <span class="keyword">if</span> response.status_code == <span class="number">200</span>:</span><br><span class="line">        lines = response.text.splitlines()</span><br><span class="line">        <span class="keyword">return</span> lines</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;找不到 <span class="subst">&#123;url&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_last_line</span>(<span class="params">url</span>):</span><br><span class="line">    response = requests.get(url)</span><br><span class="line">    <span class="keyword">if</span> response.status_code == <span class="number">200</span>:</span><br><span class="line">        lines = response.text.splitlines()</span><br><span class="line">        <span class="keyword">return</span> lines[-<span class="number">1</span>] <span class="keyword">if</span> lines <span class="keyword">else</span> <span class="literal">None</span></span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;找不到 <span class="subst">&#123;url&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span> </span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取input.txt和print.txt的内容</span></span><br><span class="line">lines1 = get_file_lines(<span class="string">&quot;https://blog.jiyu134.top/input.txt&quot;</span>)</span><br><span class="line"><span class="keyword">if</span> lines1 <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">    lines2 = get_file_lines(<span class="string">&quot;https://blog.jiyu134.top/print.txt&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取print.txt的最后一行内容</span></span><br><span class="line">last_line = get_last_line(<span class="string">&quot;https://blog.jiyu134.top/print.txt&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> last_line <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">    <span class="keyword">if</span> last_line.strip() == <span class="string">&quot;1.1&quot;</span>: <span class="comment">#这里需要更新的时候换一下</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;版本正确&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        download_choice = <span class="built_in">input</span>(<span class="string">&quot;版本不正确，需要下载最新版本，请输入Y开始下载，按下其他任意键以无视 \n&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> download_choice.lower() == <span class="string">&#x27;y&#x27;</span>:</span><br><span class="line">            output_path = <span class="built_in">input</span>(<span class="string">&quot;请输入保存路径（包括文件名）：\n&quot;</span>)</span><br><span class="line">            download_url = <span class="string">&quot;https://blog.jiyu134.top/jiyu_download.exe&quot;</span></span><br><span class="line">            download_file(download_url, output_path)</span><br><span class="line">            sys.exit()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> lines2 <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">        user_input = <span class="built_in">input</span>(<span class="string">&quot;请输入16位密钥(按Q退出) \n&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> i, line <span class="keyword">in</span> <span class="built_in">enumerate</span>(lines1):</span><br><span class="line">            <span class="keyword">if</span> line.strip() == user_input.strip():</span><br><span class="line">                result_line = lines2[i]</span><br><span class="line"></span><br><span class="line">                <span class="comment"># 检查结果是否是zip或png文件的URL</span></span><br><span class="line">                <span class="keyword">if</span> result_line.endswith((<span class="string">&#x27;.zip&#x27;</span>, <span class="string">&#x27;.jpg&#x27;</span>, <span class="string">&#x27;.png&#x27;</span>, <span class="string">&#x27;.exe&#x27;</span>)):</span><br><span class="line">                    download_choice = <span class="built_in">input</span>(<span class="string">f&quot;找到一个附件（<span class="subst">&#123;result_line&#125;</span>），是否需要下载？如果需要下载请输入Y，否则按下其他任意键以退出下载，继续识别 \n &quot;</span>)</span><br><span class="line">                    <span class="keyword">if</span> download_choice.lower() == <span class="string">&#x27;y&#x27;</span>:</span><br><span class="line">                        output_path = <span class="built_in">input</span>(<span class="string">&quot;请输入保存路径（包括文件名）：\n&quot;</span>)</span><br><span class="line">                        download_file(result_line, output_path)</span><br><span class="line">                    <span class="keyword">else</span>:</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">&quot;继续输入...&quot;</span>)</span><br><span class="line">                <span class="keyword">else</span>:</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">f&quot;结果是：<span class="subst">&#123;result_line&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;不存在（404），请重新输入或按Q退出&quot;</span>)</span><br><span class="line">            <span class="keyword">if</span> user_input.lower() == <span class="string">&#x27;q&#x27;</span>:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">        <span class="comment"># 如果获取print.txt失败，跳出循环</span></span><br><span class="line">        <span class="keyword">if</span> lines2 <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;找不到结果文件，如果网络没有问题，请报告给管理员&quot;</span>)</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;找不到比较文件，如果网络没有问题，请报告给管理员&quot;</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>打包我使用的：pyinstaller<br>还别说，这个用起来还挺简单的</p><p>程序下载链接：</p><div calss='anzhiyu-tag-link'><a class="tag-Link" target="_blank" href="https://blog.jiyu134.top/jiyu_download.exe">    <div class="tag-link-tips">引用站外地址</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="">          <i class="anzhiyufont anzhiyu-icon-link" style=""></i>        </div>        <div class="tag-link-right">            <div class="tag-link-title">jiyu_download.exe</div>            <div class="tag-link-sitename"> https://blog.jiyu134.top/jiyu_download.exe </div>        </div>        <i class="anzhiyufont anzhiyu-icon-angle-right"></i>    </div>    </a></div><p>目前它还处于空闲状态，也就是目前还不用它<br>当然如果你想试一试也可以哦~<br>输入”A””B””C””D””download”来发现吧！<br>它有一个版本识别功能，但是因为版本基本不变，就不测试了</p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;note info simple&quot;&gt;&lt;p&gt;代码参考了AI，使用了Python编程语言&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;因为一个小小的想法，我决定把之前的下载器再优化一下。&lt;/p&gt;
&lt;div calss=&#39;anzhiyu-tag-link&#39;&gt;&lt;a class=&quot;</summary>
      
    
    
    
    <category term="计算机" scheme="https://blog.jiyu134.top/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
    
    <category term="计算机" scheme="https://blog.jiyu134.top/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>兽言爪道-特别章节-纳良</title>
    <link href="https://blog.jiyu134.top/posts/nali/"/>
    <id>https://blog.jiyu134.top/posts/nali/</id>
    <published>2024-02-08T05:34:00.719Z</published>
    <updated>2024-02-08T05:34:00.719Z</updated>
    
    <content type="html"><![CDATA[<div class="note flat"><p>这里是纳良的特别章节，这里讲了纳良以前的故事。<br>希望阅读这章会使你能对纳良这个人物更加了解。</p></div><p>&emsp;&emsp;兽历644年（2004年），纳良出生了。他的父亲纳秋，母亲孜杨，看着纳良，很是开心。<br>&emsp;&emsp;但在纳良4岁生日（10月9日）的时候，父母消失了——当时纳良还在睡觉。父母留下了一张纸条：<br>&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;纳良，我们选择离开了，也许我们永远相遇不了了，但说不准以后的什么时候会再见上一面，虽然你还小，但请不要伤心，你的邻居会照顾你的。希望以后你还能记得我们，祝你生日快乐——爱你的，父母<br>&emsp;&emsp;纳良就这样被他的父母所抛弃，不知道什么理由。<br>&emsp;&emsp;自此之后，他的邻居——是个老爷爷——就每天陪着他，就像亲孙子一样。纳良也就只是知道他的父母的名字，仅此而已。<br>&emsp;&emsp;但在8年后，那个邻居，因为疾病去世了，那天，纳良哭的格外悲惨。很巧的是，孜岚正好在离他不远的地方，听到纳良在哭，孜岚跑了过来，说：“小弟弟，为什么要哭？”<br>&emsp;&emsp;纳良伤心地说：“我的爷爷…去世了…只剩了我一个人…他每天…都和我一起…生活…我虽然…有很多技能，可以打工挣钱…养活自己，但是爷爷…”他已经说不清话了。<br>&emsp;&emsp;孜岚看着他，轻轻的拍拍他的头，拥抱了他。<br>&emsp;&emsp;“没事…有我在，我陪着你！”<br>&emsp;&emsp;“真的吗！”纳良停止了哭泣，擦了擦鼻子。<br>&emsp;&emsp;“嗯！从现在开始，我们就是好朋友了！我临时在这附近住——我不是这里的人，不过我可以给你一点钱，你去买一点吃的吧。”<br>&emsp;&emsp;纳良才12岁，但他能感觉到面前的年轻狼兽人并不是一个坏人，他坚信着。<br>&emsp;&emsp;这几年，孜岚时不时陪着纳良，让纳良感到很是安心。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;note flat&quot;&gt;&lt;p&gt;这里是纳良的特别章节，这里讲了纳良以前的故事。&lt;br&gt;希望阅读这章会使你能对纳良这个人物更加了解。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;emsp;&amp;emsp;兽历644年（2004年），纳良出生了。他的父亲纳秋，母亲孜杨，看着纳良，很</summary>
      
    
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/categories/furry-said-claw-truth/"/>
    
    
    <category term="furry said claw truth" scheme="https://blog.jiyu134.top/tags/furry-said-claw-truth/"/>
    
  </entry>
  
  <entry>
    <title>反对校八股</title>
    <link href="https://blog.jiyu134.top/posts/waxx/"/>
    <id>https://blog.jiyu134.top/posts/waxx/</id>
    <published>2024-02-05T06:40:34.980Z</published>
    <updated>2024-02-05T06:40:34.980Z</updated>
    
    <content type="html"><![CDATA[<div class="tip "><p>本文写于2022&#x2F;10&#x2F;28~29<br>阅前叠甲：开玩笑的观点，请勿当真。没有对任何人其他不好的情感。理性阅读！！！</p></div><p>吾读起毛先生的《反对党八股(节选)》,那是“深有感触”。最近,我发现现在的学生,只顾埋头学习,不知道“劳逸结合”。那今日,我便用古文中的“八股”,来写一个八股,就叫八大现状吧。<br>##现状一，沉迷学习，无法自拔。<br>现在学生就好像用胶布贴在书上，手不离书或手不离笔。每名学生都有种想把课本和教辅书或是卷题“刻”上自己的所谓“正确”的“答案”。古人有“入木三分”，今生有“入纸万寸”。我认为，这样的行为会加害于学生。我更推于“听”和“视”结合，“听”是听放松的纯音乐，或是白噪音，可以读好书，如《传习录》《呐喊》等（我在这里只是随便举的例），也可以看当今时代的时文。从现代科技上获取能够提升自己见解的。总之,不能就自己“埋”书中,更不能埋在小众的书上。<br>##现状二，诗书破卷，下笔无神。<br>学生写起卷子，叫“刷题”，将自己禁锢在“题海”中。先不说对自身身体的损害，对精神上可谓巨大苦痛。读起高中生，有部分学生学习是为了高考，上课认真学下课也认真学，他们恨不得将下课取消。这样势必会引来一个对国家十分不利的后果：“高分低能的学生流入社会”。为了高考他们什么事都做得出来，像是通霄写作业（正经的）；课间（包含吃饭时间，平时是别人带饭）不浪费一丁点时间；卷子一拣可达几层楼之高。如何同机器一般，下笔无神，一脸严肃。不过要幸好现在高考中有体育不然，可以发展到很坏的地步。<br>##现状三，不衡发展，空洞无力。<br>多写字的人，在右手中指指甲下方会有一块较大的茧。因为多次用笔，已经磨出来了。劳动的人手心会有一大片的茧。多写字的人。大多脸较白，左手不善动；而劳动的人，左右手都为灵活，脸也偏黑。学生们往往坐在书桌前,没有经历过严格的吃若训练。每至军训，不是喊苦就是喊“我*”，不对劳动体育有丝毫兴趣。肌肉不多，有些人连手提箱都很难拿至千楼。<br>##现状四，缺乏实践，一词不知。<br>这就要从多方面谈起。从小时候，父母就要成严格学习，不用操别的心。有的已经早早将孩子送到了宿制学校。有的是9至10岁，有的才5到7岁。这些学生被迫进入住宿的生活，是在自力性上有所提升，但同时，他们与父母这其人面对面交谈，了解实际情况的机会变得很少。只是固定于宿舍-食堂-教室，日复一日。他们缺乏对社会的认识，与其他校外的专业人士交流就有了一定的隔墙般的困难。从题目书本上得到的是理论知识，在没有多次接触校外的情况下，很难相连起。这就易造“一问不知”的尴尬场面。古人有一句话说的好“授之鱼不如授之以渔”。只是不断地从题中得到所谓的“鱼”，那“渔”呢，就无从下手了。<br>##现状五，伤身份神，病根丝生。<br>从网上便知，从小学到高中，中国近视的人一个比一个多。从50多而70、80（百分比），这难道不伤身吗？常盯着书本看，就等书再怎么护眼，长时间着也会使眼疲弱。久而久之，近视的人就多了，若再近视下去，形成了病理性近视，那就得不偿失了。学生沉迷学习往往固定一个动作，对身体的背椎有一定的伤害。本来运动较少，再加上外力的作用便易得身体的各处“警报”，这也是不得体的。这也正是有“劳逸结合”这个词语的原因了。<br>##现状六，行业内卷，神似战场。<br>现在的成年人，不是在工作，就是在找工作的路上。工作单位都很卷。从大学毕业的人现在很难找到工作。便由此引申出学校内各自内卷的神似战场的局面了。你是晚上不睡打灯学习，早起四点起床背诵文章。正因别人开“卷”，自己也“卷”进去了，看见自己也“卷”了，别人更卖力了，长久下去就变成了恶性循环,一发不可收拾。抗战时期，日本的军队跑到中国来闹事，现在法治社会学生开始“闹事”。这不应该被称为“快乐学习”。<br>##现状七：早起晚睡，不加节制，现状八：不到未来，麻木近忧。<br>这两条现状意义自明，无需多说。<br>以上，就是校八股的八大现状。这种情况对当今社会的发展极为不利的，更应该积极采取有效行动，这样社会和国家才有希望，才能培育出多元的学生！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;tip &quot;&gt;&lt;p&gt;本文写于2022&amp;#x2F;10&amp;#x2F;28~29&lt;br&gt;阅前叠甲：开玩笑的观点，请勿当真。没有对任何人其他不好的情感。理性阅读！！！&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;吾读起毛先生的《反对党八股(节选)》,那是“深有感触”。最近,我发现现</summary>
      
    
    
    
    <category term="学习" scheme="https://blog.jiyu134.top/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="学习" scheme="https://blog.jiyu134.top/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>2024新年锌题解密的地方</title>
    <link href="https://blog.jiyu134.top/posts/2024da/"/>
    <id>https://blog.jiyu134.top/posts/2024da/</id>
    <published>2024-02-02T13:11:47.733Z</published>
    <updated>2024-02-02T13:11:47.733Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉，这个密码看着不太对，请再试试。" data-whm="抱歉，这个文章不能被纠正，不过您还是能看看解密后的内容。">  <script id="hbeData" type="hbeData" data-hmacdigest="8e8af9187431c29d595943a270954db2e0166b5b433e8ef8fc553cedc00b19e5">8ed818cc3092a2b06dc746e84b3ff895f5939cc11e77cad3eb1dc696f6723f5e550d813d706870ea3fd9ed1a837d62f76d05e32438c54f0eb0a76ce6b96da0c792ac4d2278114aa3715a1e9bf205453635d406d8654cbf123aafe78f013fc6b0650a50f184bd02bc8bcd4fb9a9dedca2c3ea177cdc4b83fec6196412e2162551e170484f69e1d075fd3a968e8e2752f70fb90e9d8074c6e461d1118489121c665480766db4d42370c406c6a3423b70cefd3dcea02620724e6690411fc453347d7e7f484584ed1e54e46795ea87e890aec07b186a692a8a972db27ec4fc3955b5</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">您好，这里需要密码。</span>      </label>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">这里有东西被加密了，需要输入密码查看哦。</summary>
    
    
    
    
    <category term="学习" scheme="https://blog.jiyu134.top/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>2024新年锌题！</title>
    <link href="https://blog.jiyu134.top/posts/43r6/"/>
    <id>https://blog.jiyu134.top/posts/43r6/</id>
    <published>2024-02-02T12:58:58.740Z</published>
    <updated>2024-02-02T12:58:58.740Z</updated>
    
    <content type="html"><![CDATA[<p>ohhh！马上就2024的春节了，我在这里为大家准备了一张试题，难度应该不大…<br>因为在家真的很无聊<br>这个试题感觉好像确实乱七八糟的…算了，直接上图片！！！<br><img src="https://www.z4a.net/images/2024/02/04/b9f1c4327ca1142b8dcccab116f7f6bc.png" alt="试卷原卷"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;ohhh！马上就2024的春节了，我在这里为大家准备了一张试题，难度应该不大…&lt;br&gt;因为在家真的很无聊&lt;br&gt;这个试题感觉好像确实乱七八糟的…算了，直接上图片！！！&lt;br&gt;&lt;img src=&quot;https://www.z4a.net/images/2024/02/04/b9</summary>
      
    
    
    
    
    <category term="学习" scheme="https://blog.jiyu134.top/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>博客1周年（提前发）</title>
    <link href="https://blog.jiyu134.top/posts/ckm4/"/>
    <id>https://blog.jiyu134.top/posts/ckm4/</id>
    <published>2023-11-05T10:21:04.996Z</published>
    <updated>2023-11-05T10:21:04.996Z</updated>
    
    <content type="html"><![CDATA[<p>嗨嗨（（・ω・｀来了）<br>博客的生日是11&#x2F;21，也就是过一段时间。。。<br>那么，让我们开始吧<br>  <span class='p center logo green large'>网站数据统计</span><br>  <span class='p center small'>本次统计了2023-2024年的数据，截止到发本篇文章的时间</span><br>1.截止当前，UP主（也可以叫博主）已发文章<code>58</code>篇。<br>2.交到了<code>56</code>个朋友！<br>3.总访问<code>5884</code>次<br> <span class='p center logo blue large'>I want to say with you about it</span><br>时间过得如此之快，现在，让我来回望一下我过去这一年来都干出了什么事。<br>10月份（大概是），在学校宿舍呆了一段时间，可把我给憋坏了。当时在写研究报告（可以翻我之前的文章）<br>11月份，因为疫情稍微松了一下，然后学校就派专车把我们分地区拉回家。然后就开始使用钉钉上网课（没好好学习）。<br>当时还是用的tabotef134.code.blog这个博客（不更新了），但是弊端也是有，当时就想能不能换一个博客系统。就在我上网搜着搜着，就看到了Hexo博客，兴趣一下子就来了。<br>跟着安知鱼，Fomalhaut等大佬的教程以及网上教程的帮助下也是成功的使用上了hexo博客（在那之前，我对github还完全不熟悉）<br>2022年12月19日，我发布了第一篇文章“欢迎，热烈欢迎”也算是纪念一下我在hexo上插的第一杆旗。<br>但是你光写文章，没有知名度怎么可以呢？<br>于是，我就到处交朋友，交友链，对，已经交了近50个了.･ﾟﾟ･(／ω＼)･ﾟﾟ･.<br>今年1月9日，我买了tabotef134.top这个域名，当时很激动（因为终于有了属于自己的一级域名），虽然在上学，班里没有一个人知道我创建了博客，但是我很高兴，我实现了自己的小梦想！<br>一月末，我申请了“开往”。<br>3月21日，我开始在博客上挂«兽言爪道»这本书。具体什么时候开始写的第一笔我也忘了。</p><div class="note info modern"><p>谈到这本书了，我就要多说说了。<br>我本来是想给“孜威”整一个设定，方便了解前因后果，于是就开始写。我当时的想法是能把故事线理顺就行（本人语文80&#x2F;150，十分垃圾）。然后又急于求成，就成了你们现在看到的样子…我在尝试要不要把它改写一下，因为我现在才刚刚把世界线理清楚。虽然你看这第二部分才刚刚开头，实际上我第二部分已经写完了（本部分结局都处理完了，但故事还没结束）<br>为了阅感我还是不把故事线说出来吧。</p></div><p>今年5月21日（阴历生日，但我不过阴历），我换了域名，就是现在这个域名。当时我很纠结，因为还要修改一大堆东西，很麻烦（本人十分懒，甚至曾经说过“懒得放假”）。以后就不会在换域名了。<br>7月5日，也就是我的16周岁生日，因为好学校，我又在学校多待了几天，生日没在家里过成。<br>7月25日，我删了butterfly主题，换成了安知鱼主题（虽然它就是基于butterfly主题吧…）<br>9月2日（大概是吧），我开学了，上了高二。高二的内容确实很难（掉头发了，好多）。<br>因为电脑不是本人的，是我姐的，就在上个月，她出了市之后，我接触电脑的时间更少了。更新的时间直线下降，不过好在有ToDesk可以远程（不过依旧很麻烦。）这也就是为什么更新友链不及时，文章发的少的原因了。<br>这一个板块是在发文章的隔天发的，因为时间紧，任务多，本文章被放到最后，所以没在当时写完。「有种为了发而发的感觉。」真的很对不起。时间真的不够啊(。•́︿•̀。)<br>维护网站确实需要花时间和精力，还有写«兽言爪道»，我这个人总是愿意放弃（三分钟热度），但是我坚持下来了！虽然成绩不咋地，但是我会加油的！<br>其实我感觉即使写了这么多也依旧很仓促，在此向各位说声抱歉（本当にごめんなさい）</p><p>本来我是准备扩写Q&amp;A的，但是我<del>懒</del><br>因为不知道该说什么。如果你有什么想问的，可以在下面评论，我如果看到了就会回复的。</p><p>一年过去了，我身高长高了1cm，体重没变（依旧是52kg）。<br>根据BMI中国标准，身高为168厘米，对应的理想体重为：62.09 kg<br>你目前的BMI是：18.4，属于体重不足的范围内，建议增加营养并继续监测BMI的变化。<br>我一度好奇，我的体质到底是什么情况，想吃胖吃不胖，可能和我饮食习惯有关吧 <del>（哭）</del> </p><p>我是一个社会废人，为什么这么说？<br>买衣服很难开口，不能一个人上饭店，什么球都不会（比如：羽毛球，乒乓球，足球，篮球等），真的一概不通，我觉得可能和我的性格有关吧…（酸）</p><p>差不多了，最后十分感谢你能看到这里，感谢陪伴我的这些朋友。<br>祝博客一周年快乐！！！</p><p>2023年11月19日10:02:20记<br>哭，今天下午开学，看来真的不能等到一周年的那个时候啦！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;嗨嗨（（・ω・｀来了）&lt;br&gt;博客的生日是11&amp;#x2F;21，也就是过一段时间。。。&lt;br&gt;那么，让我们开始吧&lt;br&gt;  &lt;span class=&#39;p center logo green large&#39;&gt;网站数据统计&lt;/span&gt;&lt;br&gt;  &lt;span class=&#39;p c</summary>
      
    
    
    
    
    <category term="博客" scheme="https://blog.jiyu134.top/tags/%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>是谁干的？</title>
    <link href="https://blog.jiyu134.top/posts/dyh7/"/>
    <id>https://blog.jiyu134.top/posts/dyh7/</id>
    <published>2023-11-05T09:57:30.905Z</published>
    <updated>2023-11-05T09:57:30.905Z</updated>
    
    <content type="html"><![CDATA[<div class="tip "><p>阅前叠甲<br>本故事有真实事件改编（但结局是编的）<br>本故事的心情均完全参考现实的心情</p></div><p>&emsp;&emsp;当会长坐在桌前，拿起桌上的批准夹准备审查的时候，却发现里面全部都被涂黑了， 一个字也看不清。他十分生气。<br>&emsp;&emsp;“这是谁干的？”<br>&emsp;&emsp;在场的人无一座答，他们都不知道是谁干的，但只有一个人，何明，他拿起了本子不知道在写什么。<br>&emsp;&emsp;“没人说话？那好，我来看监控。”<br>&emsp;&emsp;何明写的速度更快了，他写了什么？“早知道如此，我就不看那个东西了！”“完蛋了，虽然不是我干的，但也摆脱不了干系。”等一些话。他现在看起来十分紧张。<br>&emsp;&emsp;这的确不是何明干的事，他只是在旁边看着他的邻桌张东不小心地碰倒了放在旁边的墨水瓶。在监控看，何明就又像是第二凶手一样。<br>&emsp;&emsp;何明拿出了包里的一张卫生纸，擦了他头上的汗，他觉得自己如同大祸临头，仿佛已经写了退会书一样，心里十分忐忑。他内心无法安宁，现在正是关键时刻，他看向张东，张东表情十分自然，但在他那里这就是一个假象。<br>&emsp;&emsp;明天还有一场考试，是一场比较重要的考试。不能考差了，但是现在状态不好，该怎么复习才好呢？<br>&emsp;&emsp;这会，会长说了一句“太多了，是谁？”<br>&emsp;&emsp;声音很小，但在何明看来却如同晴天霹雳，让他毛骨直立，他不敢动生怕自己再加一等，他的心里好像有块大石头。<br>&emsp;&emsp;他现在又说不出来，很长时间，近二十分钟里，他不敢喘大气，眼神十分恐惧，如果被发现了后果他真的不敢想。<br>&emsp;&emsp;“我需要…冷静！”。他确实这么想，但他却不敢，他什么也不敢。他想起了一个小偷在主人眼皮下偷东西的故事，他看见张东不动，十分冷静，反而变得更加不冷静了。<br>&emsp;&emsp;会长离开了，什么都没说，所有人都离开了，现在只有他一个人在会议里。<br>&emsp;&emsp;“我…我…我…”他的精神状态十分不好。“对不起！”<br>&emsp;&emsp;他从窗户上跳了下去，从从高达20楼的窗下跳了下去，最终有两个人面归黄泉，那另一个人是谁？<br>&emsp;&emsp;另一个人正是张东。</p><p>写于<br>2023&#x2F;11&#x2F;2 20:25</p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;tip &quot;&gt;&lt;p&gt;阅前叠甲&lt;br&gt;本故事有真实事件改编（但结局是编的）&lt;br&gt;本故事的心情均完全参考现实的心情&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;emsp;&amp;emsp;当会长坐在桌前，拿起桌上的批准夹准备审查的时候，却发现里面全部都被涂黑了， 一个字也看不清。</summary>
      
    
    
    
    <category term="故事" scheme="https://blog.jiyu134.top/categories/%E6%95%85%E4%BA%8B/"/>
    
    
    <category term="故事" scheme="https://blog.jiyu134.top/tags/%E6%95%85%E4%BA%8B/"/>
    
  </entry>
  
  <entry>
    <title>博客有感·三</title>
    <link href="https://blog.jiyu134.top/posts/fy4s/"/>
    <id>https://blog.jiyu134.top/posts/fy4s/</id>
    <published>2023-08-06T12:20:09.218Z</published>
    <updated>2023-08-06T12:20:09.218Z</updated>
    
    <content type="html"><![CDATA[<p class='p center logo large'>Part 1</p><p class='p center small'>更换域名</p><p>之前我不是换过一次域名嘛由tabotef134.top改成了jiyu134.top<br>在我换好之后我查看51.la的时候，发现了这个：<br><a href="https://www.z4a.net/image/VcEv6a"><img src="https://www.z4a.net/images/2023/08/06/boke301.png" alt="boke301.png"></a><br>也就是目前依旧有人使用我的旧域名访问。因为我不可能全部都想起来收录过旧域名的网站都有哪些，所以也只能靠51.la观察一下啦<br>现在你访问旧域名应该只是一张图片而不会直接跳转了<br>具体你可以自己访问看看<img no-lazy class="inline" src="https://zhuye1.jiyu134.top/images/furry-8.jpg" style="height:1.5em"/></p><p class='p center logo large'>Part 2</p><p class='p center small'>主题修改</p><p>对，没错，就在这次暑假，我把主题修改成安知鱼主题了<br>因为原来的主题有好多bug不说，用起来也是卡卡的<br>现在这个简洁舒适，功能更多了，比如朋友圈等等</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p class=&#39;p center logo large&#39;&gt;Part 1&lt;/p&gt;
&lt;p class=&#39;p center small&#39;&gt;更换域名&lt;/p&gt;
&lt;p&gt;之前我不是换过一次域名嘛由tabotef134.top改成了jiyu134.top&lt;br&gt;在我换好之后我查看51.la的</summary>
      
    
    
    
    <category term="博客" scheme="https://blog.jiyu134.top/categories/%E5%8D%9A%E5%AE%A2/"/>
    
    
    <category term="博客" scheme="https://blog.jiyu134.top/tags/%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>之前写的诗</title>
    <link href="https://blog.jiyu134.top/posts/csjk/"/>
    <id>https://blog.jiyu134.top/posts/csjk/</id>
    <published>2023-07-28T03:11:58.113Z</published>
    <updated>2023-07-28T03:11:58.113Z</updated>
    
    <content type="html"><![CDATA[<p>6月18日<br>  <span class='p green'>《念奴娇·争安宁于当下》</span><br>  夏日将至，考前后，心情甚繁乱。抱得佳分安回归，确应举杯同庆。再上高四，心乱意散，几时可心安？只见屋内，少年泪浸书卷。<br>  风吹当夏回影，奋书疾笔，还算在风气。书落人非已错时，时年不可回放。当下高二，仍存机会，握笔争安宁！一分一秒，你我必报喜报！<br> <span class='p green'>《桂枝香·大失所望》</span><br>大作试卷，待满分完全，心里甚欢。成绩下发审看，考得稀烂。恨视作一团，无人等，心烦意乱。十分大汗，满面不堪，心如铅灌。<br>长声叹，不能独完，多次不能看，倒一怎办？可怜独守下岸，不得心安。没有彼桥没有船，若至尽头也算缘。欲行必拦，恰如柠酸，不得长叹。<br> <span class='p green'>《爷喝水也要写诗》</span><br>雪化成河入江洋，四面八方宣张扬。<br>乘风破浪抵前方，落杯入须是福祥。<br> <span class='p green'>《就是对不起《齐）》</span><br>考试不能太紧张，前试资料又一章。<br>题目一个比一个长，<br>管它对不对，写就完事了！<br>6月3日<br> <span class='p green'>《炊灰》</span><br>杨树向阳飞，心寒长久吹。愿随君直炊，却（退却）寒于余辉。<br> <span class='p green'>《有爱在心行》</span><br>人兽有所爱，蔑视时无奈，我体虽尽碍，心永向明开。<br> <span class='p green'>《堵》</span><br>坐舟环河独一船，水至尽头挡于山。司马江洲泪浸杉，可怜独人处石杉。<br>5月14日<br> <span class='p green'>《母亲》</span><br>听，是婴儿的哭声&#x2F;往往往此时，一个人就要过去安挽了&#x2F;那是一个你永远忘不了的人&#x2F;哦！母亲。<br>从小到大，她是那么伟大&#x2F;无微不至的照顾！为你不停奔波&#x2F;尽管很黑，但她连择忍受一切。<br>时值青春期的少年，很是叛递&#x2F;他们会惹母亲生气&#x2F;但他们不知，身在床上不认床，却认草席铺地上。<br>小时候母亲打了把大伞，为你遮雨&#x2F;长大了身子弯了，不能了，不能了&#x2F;你还像小时候一样吗：“妈妈，你别忙了，休息一下吧！我来！”<br>小时候母亲抱着你&#x2F;现在你抱着她&#x2F;夜晚之时&#x2F;“妈妈，母亲节快乐”<br>5月8日<br> <span class='p green'>《藏头》</span><br>Health is important.<br>Eyes are big windows people think.<br>Legs are walking tools.<br>People need them very much.<br>My life is gone,<br>Even anything I found will be dead quicky!<br> <span class='p green'>《时间》</span><br>滴答，滴答，是时间的应答&#x2F;你每前进一步，它都会响一声以示尊重&#x2F;看，是那么的公平&#x2F;别人走得比它快，它依旧不紧不慢<br>为有要谈起这个呢&#x2F;读过前几个的你，大概明白&#x2F;因为是当时的处境啊！<br>有话说的是真对，叫“寸金难买寸光阴”&#x2F;时间不会跟你一样那么慢。<br>明月相替，是时间最朴素的表达方式&#x2F;但也许，根本不存在呵！<br>时间啊，恳求您慢一些吧&#x2F;这少年还不想长大啊&#x2F;如果不可，那只好坐在椅子上&#x2F;自相矛盾的&#x2F;品尝那甘甜的浓柠檬汁<br>5月5日<br> <span class='p green'>《雨》</span><br>阴云布天，空气沉沉的，那要下雨了&#x2F;这雨乃透心凉，很是清爽&#x2F;滴在竹叶上，壮景哉！<br>又何谈此&#x2F;因为，正下呵，正下呵<br>老百姓种物，何不求雨润苗&#x2F;学生祈雨，是为停操休身<br>繁事相随道，吾不愿多添一事&#x2F;愿都与雨相过，堆在远方<br>雨是那么清凉&#x2F;坐在那里的我，泪与雨已经分不清了罢<br>5月3日<br>《铅笔》<br>有的时候，手持钱笔，试图找到答案&#x2F;但越写越是心情烦乱&#x2F;直至最后，真正摆烂<br>铅的消逝，是对时间的评价，是成功的见证者&#x2F;一根又一根，却只用来消磨时光<br>又为何读起这个&#x2F;因为已经足多真实<br>多次下笔&#x2F;越细致，越是心烦意乱&#x2F;是我脑里一片空的，还是我一直沉浸在梦里&#x2F;从不明白<br>向往生活，又何不是一点一滴做起&#x2F;就同铅笔一样，一笔一笔的磨损&#x2F;确实苦，但值得<br>4月18日<br>title:白纸<br> 激鱼<br>当你有了一张白纸的时候<br>你会想将它渲染成精美的画<br>但有时却无以下笔<br>不知道该写什么</p><p>你干坐在那里不知所措<br>或许有的时候迟迟放不下笔<br>在发呆，在拒绝</p><p>为什么我会谈起这个<br>因为我在诉说我的处境<br>真实的场景</p><p>园月升起，故乡的月亮更圆<br>纯浩如白纸<br>当你用五颜六色去层层作画，那是展现<br>同时也是噩梦的开始</p><p>白纸是白的，什么也没有<br>是那么无真，无邪<br>而彩色若是搭配合理，那是展放光荣<br>若不小配错了，那就是污点</p><p>时间流去，那黑墨几近落下<br>你 救了自纸<br>因为你想让它保持单纯，可爱。<br>4月2日<br>四月二日作诗两首<br>title:鲲的结果<br> 激鱼<br>天上神会闹天鲲，<br>天鲲见神都中分。<br>背带在身像坤坤，<br>大仙浅尝人有份。</p><p>title:再见<br> 激鱼<br>先前失母又失父，<br>多次阻杀多日复。<br>不见钱来把木斧，<br>钱少将命托阎付。<br>3月24日<br>三二肆有感受诗<br>劳困多年立岗位，毫丝不愿把神退。<br>层层难处明里对，实处真无可商会。<br>3月14日<br>西方的树压过东方的花，<br>北方的雪吹过南方的水。<br>是压，是吹。<br>树曾被雪所覆盖，<br>花曾被水所浇溉。<br>是成长，是希望。<br>花成长，不是一般的花，<br>它长，它长，<br>以致于顶起了树<br>水结冰，不是一般的水，<br>它化，它化，<br>以致于化掉了雪。<br>花阳光的照射，<br>更美了；<br>水受雨露的参加，<br>更多了。<br>花成了片花海，<br>水成了条小河。<br>花自发折断，<br>掉在河中，<br>向着阳光的方向，<br>不断前行…..<br>3月11日<br>自己写的诗<br>题目：变化多端<br>天公弹瑟多欢畅，一会寒霜一会阳。<br>风吹寒心凉半遭，冬夏交替做示样。<br>还有一个<br>题目：高中不易，且行珍惜<br>高山阳面花常开，<br>中层云朵阴映台。</p><p>不寒不够多变态，<br>易冷还应着厚铠。<br>且望路边有小偷，<br>行走半岔又回头。<br>珍宝无数分分投，<br>惜钱怜币清凉透。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;6月18日&lt;br&gt;  &lt;span class=&#39;p green&#39;&gt;《念奴娇·争安宁于当下》&lt;/span&gt;&lt;br&gt;  夏日将至，考前后，心情甚繁乱。抱得佳分安回归，确应举杯同庆。再上高四，心乱意散，几时可心安？只见屋内，少年泪浸书卷。&lt;br&gt;  风吹当夏回影，奋书疾笔，还算在</summary>
      
    
    
    
    
    <category term="学习" scheme="https://blog.jiyu134.top/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>/置顶/2023年暑假计划（难受+1）</title>
    <link href="https://blog.jiyu134.top/posts/2023xue/"/>
    <id>https://blog.jiyu134.top/posts/2023xue/</id>
    <published>2023-07-23T11:26:01.602Z</published>
    <updated>2023-07-23T11:26:01.602Z</updated>
    
    <content type="html"><![CDATA[<div align="center" class="aspect-ratio">  <iframe    src="https://player.bilibili.com/player.html?aid=866813798&&page=1&as_wide=1&high_quality=1&danmaku=0"    scrolling="no"    border="0"    frameborder="no"    framespacing="0"    high_quality="1"    danmaku="1"    allowfullscreen="true"  ></iframe></div><span class='p logo green large'>第一部分</span> <span class='p small'>开场白</span>很抱歉我发这个文章发晚了...至于为什么要发这个文章呢？原因我也不知道。虽然假期已经过去了大概1/3了吧.....但这依旧不影响好吧~其实也没啥可说的，看就完事了。还有，稍微说一下，即使假期结束了，这篇文章也不会删除，不过会撤出置顶（看我有没有时间吧）。好了不说废话了*修改时间：2023/07/25*<span class='p logo red large'>第二部分</span><span class='p small'>作业清单</span><div class="note simple"><p>这里放的是腾讯文档的链接，可能你看到的时候还没补完文档，不过后面会补的…<br>绝对安全！不含病毒，<strong>更符合中国学生体质~</strong></p></div><a href="https://docs.qq.com/sheet/DUnJtUlJEdURrYnlh?tab=BB08J2">暑假安排点击此处</a><img src="https://www.z4a.net/images/2023/07/23/2023-2024.png"     width="172"     height="224"     align=left />长大了想要当太空人爷爷奶奶可高兴了给我爱吃的暑假作业今天，暑假作业倡导鲜上加鲜加一点树脂鲜，加一点爆炸味道好极了~如果扫不了可以点击放大<span class='p logo yellow large'>第三部分</span><span class='p small'>哔哔机plus~</span>没错，我在暑假的绝大部分哔哔都会在这里...虽然没啥可说的吧...<div class="timeline "><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p class='p span blue'>7-25 09:43</p></div></div><div class='timeline-item-content'><p>快开学了呢~</p></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p class='p span blue'>7-25 09:43</p></div></div><div class='timeline-item-content'><p>本来刚放假的时候想一边写作业一边复习的，不过好像有点…困难？<img no-lazy class="inline" src="https://zhuye1.jiyu134.top/images/furry-17.jpg" style="height:1.5em"/><br>我看能不能在这几天把进度补回来…<img no-lazy class="inline" src="https://zhuye1.jiyu134.top/images/furry-14.jpg" style="height:1.5em"/><br>记得参加活动哦！<a href="https://blog.jiyu134.top/posts/huodong/">点此处跳转</a><br>活动从今天开始一直到8月31号，先到先得哦！</p></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p class='p span blue'>7-24 14:34</p></div></div><div class='timeline-item-content'><p>今天看看能不能把语文补回来…<img no-lazy class="inline" src="https://zhuye1.jiyu134.top/images/furry-6.jpg" style="height:1.5em"/>真的很难办啊~~~</p></div></div></div>注：背景壁纸来源：Twitter<a href="https://twitter.com/gundanw">@gundanw</a>]]></content>
    
    
      
      
    <summary type="html">&lt;div align=&quot;center&quot; class=&quot;aspect-ratio&quot;&gt;
  &lt;iframe
    src=&quot;https://player.bilibili.com/player.html?aid=866813798&amp;&amp;page=1&amp;as_wide=1&amp;high_qu</summary>
      
    
    
    
    
    <category term="学习" scheme="https://blog.jiyu134.top/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>自己做的卷子</title>
    <link href="https://blog.jiyu134.top/posts/3561/"/>
    <id>https://blog.jiyu134.top/posts/3561/</id>
    <published>2023-07-20T07:13:11.537Z</published>
    <updated>2023-07-20T07:13:11.537Z</updated>
    
    <content type="html"><![CDATA[<p>别纠真，随便搞的。<br>听力：</p><a class="btn-anzhiyu " href="https://tabotef134.lanzoul.com/iCFUm130dwoj"   title="蓝奏云下载"><span>蓝奏云下载</span></a><p>试卷：</p><a class="btn-anzhiyu " href="https://tabotef134.lanzoul.com/iAA75130efaj"   title="蓝奏云下载"><span>蓝奏云下载</span></a><p>答题卡：</p><a class="btn-anzhiyu " href="https://tabotef134.lanzoul.com/i677S130efba"   title="蓝奏云下载"><span>蓝奏云下载</span></a><p>答案？没搞，自己摸索吧。<br>嗯…有听力答案：1-5 BBCAC 6-10 CBCAB 11-15BABCA 16-20 ACAAA</p><p>听力原文：<br>(text 1)<br>M:Hello, would you like some juice?<br>W:Thank you for your kindness.By the way, do you have B5 paper? I need to write a letter to my pen Pal.<br>M:I’m sorry, I don’t have any here.But I have A4 paper.Do you need it?<br>W:Sure.<br>(text 2)<br>W:Hey, long time no see!<br>M:What a coincidence! Where are you going in such a hurry?<br>W:Oh, I’m going home to get my papers.<br>M:Oh! Do you want me to take you?<br>W:No need.By the way, I remember you’re going to a party.What’s the name?<br>M:Super furry fusion, I really like it.I can’t wait!<br>W:Oh! I’ll go there some day.And don’t forget you have a meeting in about 30 minutes.<br>M:What? Ouch! Oh, my God!<br>(text 3)<br>W:Would you like something to drink?<br>Man:Maybe next time.I’m full.I think of something.I want to go to the supermarket to do some shopping.Can you go with me?<br>W:Sure, but it’s already midnight.We’ll talk tomorrow.Hey! Watch out for the  car!<br>(text 4)<br>M:Oh! Watch it!<br>W:I didn’t notice.I’m sorry.<br>M:That’s okay.I hope your clothes aren’t wet.<br>W:Yeah, it’s just a little wet, but I have another one.Oh, I forgot that one was at home.This is the only way to go to class.<br>Man:I can lend you a new one.<br>W:No, thanks for the offer.<br>(text 5)<br>W:Look at that!<br>M:What is it?<br>W:It just passed, and now it’s gone.<br>M:Is that it?<br>W:no, that’s a dog.<br>M:It’s that…Chicken?<br>W:Yes, that one!<br>M:What’s there to see about chickens? I have a lot of sheep at home.Do you want to see them?<br>(text 6)<br>W:Hey, where are you?<br>M:I’m in the fifth division of the company.What’s the matter?<br>W, I’m on the sixth floor of the mall.Do you want me to buy you a dress?<br>M:OK! But doesn’t floor five buy gold jewelry?<br>W:Oh, I was wrong.It’s four floors.<br>M:All right.Can you buy me a pair of overalls? The money has been transferred to the bank card.<br>W:Sure, I will.I remember your basketball blew up.You want me to get it for you<br>M:No, I’ve already bought it.<br>W:I see.I’ll surprise you when I get back.<br>M:One hundred thousand yuan from the bank card.Wait, what are you doing?<br>W:SHH…It’s a secret!<br>(text 7)<br>W:Good morning, Sir.<br>M:Good morning.<br>W:I’m sorry I was so busy yesterday.Can I see your ID?<br>M:Of course.Wait, I can’t find it.Can you look for it?<br>W:I remember it in the drawer.Ah! Here it is.Sir, I’ll send you a hospital report soon.Please put it in this folder and I’ll come back later.Have a nice day.Bye.<br>(text 8)<br>W:Isn’t this Li Tian Suo?<br>M:Ha ha what a coincidence.By the way, I bought two tickets for the movie.Do you want to watch it together?<br>W:Thank you very much for your kindness! But I want to do my homework…Let me think.I can do my homework tomorrow.So, what was that movie?<br>M:It’s a movie about a werewolf who grows up from being abandoned as a child to learning new knowledge on his own.How about that?<br>W:Sounds good.What time does the movie start?<br>M:Two more hours.What time is it?<br>W:1:00pm…No, it should be 2:00pm.<br>M:Your watch is about 45 minutes fast, okay…I have a project to finish.I’ll meet you here later!<br>W:OK, I’m busy too.<br>(text 9)<br>M:Have you ever heard of Ardolf?<br>W:Never heard of it.<br>M:I think “wlid water” sounds good.You can listen to it if you’re interested.<br>W：I will.By the way, I remember it’s Jack’s birthday tomorrow.What do you think I should buy?<br>M:What’s the date today?<br>W:Well…Let me see.April 15th, 6:15 p.m.<br>M：Haven’t you changed your watch back yet? I thought I told you earlier that your watch was 45 minutes fast.<br>W:Ha ha, I forgot! Excuse me…Oh, is it that late already? Would you like to come to my house for dinner tonight? Everyone else is busy tonight.I can make my specialty dish called “Fish fragrant shredded pork”.<br>M:Sorry, I have a meeting at 6:30 this evening,   but you can invite Jack to your house tomorrow for our birthday.Back to furry.I thought Jack said he liked furry.You could buy some perimeter.<br>W:I see.Don’t forget to come to my house tomorrow night.<br>M:I remember.Bye!<br>(text 10)<br>M＆W：Good evening, fellow viewers.Today is December 24, 2020, the 17th of the fourth lunar month.Yesterday, a meteor from outer space hit near Yushu, Qinghai Province.It was the most energetic bolide event in China since records began in 1988, and one of the top 15 most energetic bolide events worldwide.The speed of the fall, the long duration of the fall, and the extremely high brightness of the landing indicate that it did not burn up in the air, and a large number of meteorites reached the ground at that time.That’s all for this report.Thank you for watching.We are in the midst of a severe outbreak.Please wear a mask and disinfect yourself to prevent infection with the new coronavirus.</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;别纠真，随便搞的。&lt;br&gt;听力：&lt;/p&gt;
&lt;a class=&quot;btn-anzhiyu &quot; href=&quot;https://tabotef134.lanzoul.com/iCFUm130dwoj&quot; 
  title=&quot;蓝奏云下载&quot;&gt;&lt;span&gt;蓝奏云下载&lt;/span&gt;&lt;/a&gt;
&lt;</summary>
      
    
    
    
    
    <category term="学习" scheme="https://blog.jiyu134.top/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>关于我换了一个写文章的工具</title>
    <link href="https://blog.jiyu134.top/posts/3873/"/>
    <id>https://blog.jiyu134.top/posts/3873/</id>
    <published>2023-06-09T01:46:09.832Z</published>
    <updated>2023-06-09T01:46:09.832Z</updated>
    
    <content type="html"><![CDATA[<p>因为感觉Notepad++没有Visual Studio Code好用，于是就换成了VSC。<br>要说这VSC功能还挺多（其实还是好看了），比如终端，资源管理器（这个好像Notepad++也有哈）等等…<br>别问为什么要写个文章说这个，绝对不是水文章。<br>我在网上稍微查了那么一下，发现Notepad++的开发者多次发表反华言论。<br><img src="https://www.z4a.net/images/2023/06/09/v2-59c990f2158d7dd81e277759ba5cb7c7_1440w.png" alt=" "><br>虽然后面他澄清了一下，但是……怎么说呢？所以我把它换掉了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;因为感觉Notepad++没有Visual Studio Code好用，于是就换成了VSC。&lt;br&gt;要说这VSC功能还挺多（其实还是好看了），比如终端，资源管理器（这个好像Notepad++也有哈）等等…&lt;br&gt;别问为什么要写个文章说这个，绝对不是水文章。&lt;br&gt;我在网上稍</summary>
      
    
    
    
    <category term="日常" scheme="https://blog.jiyu134.top/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="日常" scheme="https://blog.jiyu134.top/tags/%E6%97%A5%E5%B8%B8/"/>
    
  </entry>
  
  <entry>
    <title>讨论一下y=x的x次方这个奇怪的方程</title>
    <link href="https://blog.jiyu134.top/posts/gekuc/"/>
    <id>https://blog.jiyu134.top/posts/gekuc/</id>
    <published>2023-04-30T07:31:53.177Z</published>
    <updated>2023-04-30T07:31:53.177Z</updated>
    
    <content type="html"><![CDATA[<p>在上个期我学了指数函数，然后当时就有这么一个想法，有没有X的X次方？所以我想讨论一下y&#x3D;x^x这个奇怪的方程。<br>我是先研究的y&#x3D;x^x再向后有扩展的，那就先说y&#x3D;x^x吧。在一开始，我是列了这样一个表。<br>先是y&#x3D;x^(1-x)。这个图像的草图如下<br><img src="https://www.z4a.net/images/2023/04/30/7264fa44-a977-4001-b902-e99617255b9a.jpg" width=200 height=300 /><br>当然，这是一开始，有些地方还有错误。我是最开始认为正整数它就是一条直接向y轴正半轴冲的曲线，往后一段时间都在处理负整数和其他数了。我当时一看，这y轴一会在y轴上方，一会在y轴下方，就很奇怪，但是依旧没有想太多。<br>到正分数选择了几个代表的，如二分之一，三分之一，四分之一。当我看到X&#x3D;二分之一和X&#x3D;四分之一时我还以为是我错了，更时还在纳闷为什么y一模一样的，都是2倍根号2。后面开始看一些奇怪的数了，如π、e等，至于y嘛，无解。<br>再到后面，大概是去年（2022年）十月份，当时学校说是排练，但实际是封宿舍了。我就拿了三本书（都是教材帮），还有计算器。主要还是太无聊，有了上次的经验，就选择用计算器来算。那是一个夜晚的自习，算到十分位，到0.5的时候就发生了一个在意料收内又在意料之外的事。<br><img src="https://www.z4a.net/images/2023/04/30/dca0960a-fe35-4533-b1a4-34a75b965caa.jpg" alt=" "></p><p><img src="https://www.z4a.net/images/2023/04/30/15eda529-2ce8-4095-9054-e72690583870.jpg" alt=" "><br>在0.1<del>0.4是由大到小，到0.5</del>0.9的时候是由小到大，但后就画了一个草图。“应该有个最小值，不过是啥呢?”后来从0.01也就是百分位开算，结果如下</p><p>到0.38的时候开始上升，然后又算了0.375，也是上升的，图里面没写上去，是0.6924803（大约）。其实到这里，我的想法差不多就定了，到最后去上网看了一下图像，和我画的很像。<br>⑥那么y&#x3D;x^x就可以告一段落了。现在开始讲我所研究的几个扩展。<br><img src="https://www.z4a.net/images/2023/04/30/de97f593-ef1e-4b14-b1a7-2ac48de8954a.jpg"></p><p>这个图得当然和X^X不一样，因为我的科学计算器最大只显示到x&#x3D;57。在这里提示一下，以下的几个拓展，都只研究正整数（或者加个“0”）。<br>下一个扩展，y&#x3D;x的x分之一次方。因为0不能做除数，所以0不能取。虽然没有求y的最大值，但大概是在2到4之间吧，数比根号2大。<br>②最后一个y&#x3D;x^2x，这个图像一名和×^x是一致，所以这就不多说了。<br>④所次来做一个小的总结。先声明这绝对不是水文章。是一个对指数函数的更深的了解，当然同学们如果还想进行更深的了解，可以在下方评论区讨论！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;在上个期我学了指数函数，然后当时就有这么一个想法，有没有X的X次方？所以我想讨论一下y&amp;#x3D;x^x这个奇怪的方程。&lt;br&gt;我是先研究的y&amp;#x3D;x^x再向后有扩展的，那就先说y&amp;#x3D;x^x吧。在一开始，我是列了这样一个表。&lt;br&gt;先是y&amp;#x3D;x^(1-</summary>
      
    
    
    
    <category term="学习" scheme="https://blog.jiyu134.top/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="学习" scheme="https://blog.jiyu134.top/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>公主和松鼠的故事</title>
    <link href="https://blog.jiyu134.top/posts/b15/"/>
    <id>https://blog.jiyu134.top/posts/b15/</id>
    <published>2023-03-19T02:31:45.000Z</published>
    <updated>2023-03-19T02:31:45.000Z</updated>
    
    <content type="html"><![CDATA[<p>①很久很久之前，有一个公主，她他喜欢和森林的小动物一起坐在树下星星。“你看啊，小松鼠，那是你，那多像你啊。你看，那是花，和你手里的一样。”这样的生活在大人眼里是无聊的空虚的。“小松鼠啊，什么时候你能开口说话啊！这样我就有朋友了。”<br>②小公主每天都会来这里，因为那只松鼠总会在那里等它。“这是什么？哇，是蓝莓，谢谢你，小松鼠。”她一边笑着，一边把那几颗蓝莓吃下。“你知道吗？我有一个母亲，她勤劳能干，我还有一个父亲，他喜欢为别人造剑。他们每天都工作，我只能在这里看星星。”“今天的星星比昨天的多啊！”松鼠说话了“哇！你会说话！是星星，一定是是给了你魔力让你说话的！你叫什么名字？小松鼠”“我叫杰克，和你一样，也是来看星星的。”<br>③小公主露出的笑容是那么甜美。”一个人的生活是让我感到没有意思，明天早晨你可以来我的房间吗？”当然可以，我美丽的公主。”那晚，小公主感到无比快乐。<br>④白天，那个小松鼠如约而至的从窗户跳了进来。”啊，杰克！我从父亲的旧书屋中翻出了一本童话书，原来他也喜欢读那本书。”“名字叫《青蛙王子的故事》，真好听啊。”“嗯…里面说公主亲吻了那只青蛙，然后青蛙就变成了王子，你会不会也可以变王子啊.”“抱歉，我的公主，我恐怕无法像你想的那样。”⑤公主和杰克一起读了其他的故事。读完后，天已经黑了。“今天我们继续看星星吧。”当他们到达那地方时，出现了一座天桥。“这是什么？我可以上去吗？杰克，我们能上星星看其他星星了！”公主每上几格，身体就越变透明，最后她和杰克消失了。<br>⑤那天夜晚，公主吃下蓝莓，神志不清，加上森林起火，等明天被人们发现时，公主的骨头里含着那只松鼠的骨头，一起离开人世。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;①很久很久之前，有一个公主，她他喜欢和森林的小动物一起坐在树下星星。“你看啊，小松鼠，那是你，那多像你啊。你看，那是花，和你手里的一样。”这样的生活在大人眼里是无聊的空虚的。“小松鼠啊，什么时候你能开口说话啊！这样我就有朋友了。”&lt;br&gt;②小公主每天都会来这里，因为那只松鼠</summary>
      
    
    
    
    <category term="故事" scheme="https://blog.jiyu134.top/categories/%E6%95%85%E4%BA%8B/"/>
    
    
    <category term="故事" scheme="https://blog.jiyu134.top/tags/%E6%95%85%E4%BA%8B/"/>
    
  </entry>
  
</feed>
