<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Joe的小站</title>
  
  <subtitle>安得广厦千万间</subtitle>
  <link href="https://blog.980712.xyz/atom.xml" rel="self"/>
  
  <link href="https://blog.980712.xyz/"/>
  <updated>2026-05-29T08:32:53.125Z</updated>
  <id>https://blog.980712.xyz/</id>
  
  <author>
    <name>joesonshaw</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>利用青龙面板备份搬瓦工VPS信息到数据库，并利用navicat生成图表</title>
    <link href="https://blog.980712.xyz/posts/1679438152.html"/>
    <id>https://blog.980712.xyz/posts/1679438152.html</id>
    <published>2024-12-27T11:47:00.000Z</published>
    <updated>2026-05-29T08:32:53.125Z</updated>
    
    <content type="html"><![CDATA[<h3 id="1-在搬瓦工VPS中获取API信息"><a href="#1-在搬瓦工VPS中获取API信息" class="headerlink" title="1. 在搬瓦工VPS中获取API信息"></a>1. 在搬瓦工VPS中获取API信息</h3><blockquote><p>获取VEID和API KEY，下面的接口中会有用到</p></blockquote><p><img src="https://image.980712.xyz/file/1735290832524_image.png" alt="搬瓦工VPS面板中获取VEID和API KEY"></p><h3 id="2-创建数据库"><a href="#2-创建数据库" class="headerlink" title="2. 创建数据库"></a>2. 创建数据库</h3><pre class="line-numbers language-sql" data-language="sql"><code class="language-sql"><span class="token keyword">SET</span> NAMES utf8mb4<span class="token punctuation">;</span><span class="token keyword">SET</span> FOREIGN_KEY_CHECKS <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token comment">-- ----------------------------</span><span class="token comment">-- Table structure for banwagon</span><span class="token comment">-- ----------------------------</span><span class="token keyword">DROP</span> <span class="token keyword">TABLE</span> <span class="token keyword">IF</span> <span class="token keyword">EXISTS</span> <span class="token identifier"><span class="token punctuation">`</span>banwagon<span class="token punctuation">`</span></span><span class="token punctuation">;</span><span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> <span class="token identifier"><span class="token punctuation">`</span>banwagon<span class="token punctuation">`</span></span>  <span class="token punctuation">(</span>  <span class="token identifier"><span class="token punctuation">`</span>id<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span> <span class="token keyword">AUTO_INCREMENT</span> <span class="token keyword">COMMENT</span> <span class="token string">'主键'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>ve_status<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'状态'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>ve_mac1<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'MAC地址'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>ve_used_disk_space_b<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'硬盘已用空间'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>ve_disk_quota_gb<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'硬盘配额GB'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>ssh_port<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'SSH端口'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>load_average<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'平均负载'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>mem_available_kb<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'可用内存KB'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>swap_total_kb<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'SWAP总额KB'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>swap_available_kb<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'SWAP可用KB'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>node_location_id<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'节点位置ID'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>node_location<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'节点位置'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>node_datacenter<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'节点数据中心'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>location_ipv6_ready<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'是否支持IPV6'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>plan<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'计划名称'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>plan_monthly_data<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'每月流量B'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>monthly_data_multiplier<span class="token punctuation">`</span></span> <span class="token keyword">double</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'某些位置提供更昂贵的带宽;此变量包含带宽计费系数。'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>plan_disk<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'磁盘配额（字节）'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>plan_ram<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'RAM（字节）'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>plan_swap<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'SWAP（字节）'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>os<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'系统'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>email<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'邮箱'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>data_counter<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'当前账单月使用的数据传输量。需要乘以 monthly_data_multiplier'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>data_next_reset<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'传输计数器重置的日期和时间（UNIX 时间戳）'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>ip_addresses<span class="token punctuation">`</span></span> <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> utf8mb4 <span class="token keyword">COLLATE</span> utf8mb4_general_ci <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'IP地址'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>suspended<span class="token punctuation">`</span></span> <span class="token keyword">tinyint</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'暂停'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>policy_violation<span class="token punctuation">`</span></span> <span class="token keyword">tinyint</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'违反政策'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>total_abuse_points<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'暂停次数（当前日历年）'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>max_abuse_points<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'累积的滥用点总数(计划在一个日历年)'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>free_ip_replacement_interval<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'免费ip更换间隔'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>error<span class="token punctuation">`</span></span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">32</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'已执行命令的退出状态码'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>veid<span class="token punctuation">`</span></span> <span class="token keyword">bigint</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token boolean">NULL</span> <span class="token keyword">COMMENT</span> <span class="token string">'veid'</span><span class="token punctuation">,</span>  <span class="token identifier"><span class="token punctuation">`</span>create_at<span class="token punctuation">`</span></span> <span class="token keyword">datetime</span> <span class="token boolean">NULL</span> <span class="token keyword">DEFAULT</span> <span class="token keyword">current_timestamp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">COMMENT</span> <span class="token string">'创建时间'</span><span class="token punctuation">,</span>  <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span> <span class="token punctuation">(</span><span class="token identifier"><span class="token punctuation">`</span>id<span class="token punctuation">`</span></span><span class="token punctuation">)</span> <span class="token keyword">USING</span> <span class="token keyword">BTREE</span><span class="token punctuation">)</span> <span class="token keyword">ENGINE</span> <span class="token operator">=</span> <span class="token keyword">InnoDB</span> <span class="token keyword">AUTO_INCREMENT</span> <span class="token operator">=</span> <span class="token number">5</span> <span class="token keyword">CHARACTER</span> <span class="token keyword">SET</span> <span class="token operator">=</span> utf8mb4 <span class="token keyword">COLLATE</span> <span class="token operator">=</span> utf8mb4_general_ci ROW_FORMAT <span class="token operator">=</span> Dynamic<span class="token punctuation">;</span><span class="token keyword">SET</span> FOREIGN_KEY_CHECKS <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="3-青龙面板新增脚本和任务"><a href="#3-青龙面板新增脚本和任务" class="headerlink" title="3. 青龙面板新增脚本和任务"></a>3. 青龙面板新增脚本和任务</h3><blockquote><p>在青龙中新建脚本后添加任务，定时执行，就能定时将VPS状态信息存进数据库啦</p></blockquote><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> requests<span class="token keyword">import</span> mysql<span class="token punctuation">.</span>connector<span class="token comment"># --- Configuration ---</span>API_ENDPOINT <span class="token operator">=</span> <span class="token string">"https://api.64clouds.com/v1/getLiveServiceInfo?veid=&lt;YOUR_VEID_HERE&gt;&amp;api_key=&lt;YOUR_API_KEY_HERE&gt;"</span> <span class="token comment">#改配置</span>DATABASE_HOST <span class="token operator">=</span> <span class="token string">"DATABASE_HOST"</span> <span class="token comment">#改配置</span>DATABASE_USER <span class="token operator">=</span> <span class="token string">"DATABASE_USER"</span> <span class="token comment">#改配置 </span>DATABASE_PASSWORD <span class="token operator">=</span> <span class="token string">"DATABASE_PASSWORD"</span> <span class="token comment">#改配置</span>DATABASE_NAME <span class="token operator">=</span> <span class="token string">"YOUR_DATABASE_NAME"</span> <span class="token comment">#改配置</span>DATABASE_TABLE <span class="token operator">=</span> <span class="token string">"DATABASE_TABLE"</span> <span class="token comment">#改配置</span>DATABASE_PORT <span class="token operator">=</span> <span class="token number">3306</span> <span class="token comment">#改配置</span><span class="token comment"># --- API Call ---</span><span class="token keyword">try</span><span class="token punctuation">:</span>    response <span class="token operator">=</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>API_ENDPOINT<span class="token punctuation">)</span>    response<span class="token punctuation">.</span>raise_for_status<span class="token punctuation">(</span><span class="token punctuation">)</span>    item <span class="token operator">=</span> response<span class="token punctuation">.</span>json<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token keyword">except</span> requests<span class="token punctuation">.</span>exceptions<span class="token punctuation">.</span>RequestException <span class="token keyword">as</span> e<span class="token punctuation">:</span>    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Error during API request: </span><span class="token interpolation"><span class="token punctuation">{</span>e<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>    exit<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token comment"># --- Database interaction ---</span><span class="token keyword">try</span><span class="token punctuation">:</span>    mydb <span class="token operator">=</span> mysql<span class="token punctuation">.</span>connector<span class="token punctuation">.</span>connect<span class="token punctuation">(</span>        host<span class="token operator">=</span>DATABASE_HOST<span class="token punctuation">,</span>        user<span class="token operator">=</span>DATABASE_USER<span class="token punctuation">,</span>        password<span class="token operator">=</span>DATABASE_PASSWORD<span class="token punctuation">,</span>        database<span class="token operator">=</span>DATABASE_NAME<span class="token punctuation">,</span>        port<span class="token operator">=</span>DATABASE_PORT <span class="token comment">#Added Port setting</span>    <span class="token punctuation">)</span>    cursor <span class="token operator">=</span> mydb<span class="token punctuation">.</span>cursor<span class="token punctuation">(</span>prepared<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span>    <span class="token comment">#SQL Injection Prevention: Use parameterized queries.</span>    sql <span class="token operator">=</span> <span class="token triple-quoted-string string">"""        INSERT INTO banwagon (            ve_status, ve_mac1, ve_used_disk_space_b, ve_disk_quota_gb, ssh_port, load_average,             mem_available_kb, swap_total_kb, swap_available_kb, node_location_id, node_location,             node_datacenter, location_ipv6_ready, plan, plan_monthly_data, monthly_data_multiplier,             plan_disk, plan_ram, plan_swap, os, email, data_counter, data_next_reset, ip_addresses,             suspended, policy_violation, total_abuse_points, max_abuse_points, free_ip_replacement_interval,             error, veid        ) VALUES (            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s        )    """</span>    <span class="token comment">#Map API response keys to database columns.  Handle missing keys gracefully.</span>    ip_addresses_str <span class="token operator">=</span> <span class="token string">", "</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'ip_addresses'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token comment"># Handle missing or empty list</span>    values <span class="token operator">=</span> <span class="token punctuation">(</span>        item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'ve_status'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'ve_mac1'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'ve_used_disk_space_b'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'ve_disk_quota_gb'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span>        item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'ssh_port'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'load_average'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'mem_available_kb'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'swap_total_kb'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span>        item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'swap_available_kb'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'node_location_id'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'node_location'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span>        item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'node_datacenter'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'location_ipv6_ready'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'plan'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'plan_monthly_data'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span>        item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'monthly_data_multiplier'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'plan_disk'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'plan_ram'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'plan_swap'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span>        item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'os'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'email'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'data_counter'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'data_next_reset'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> ip_addresses_str<span class="token punctuation">,</span>        item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'suspended'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'policy_violation'</span><span class="token punctuation">,</span> <span class="token boolean">None</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'total_abuse_points'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'max_abuse_points'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span>        item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'free_ip_replacement_interval'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'error'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> item<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'veid'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>    <span class="token punctuation">)</span>    cursor<span class="token punctuation">.</span>execute<span class="token punctuation">(</span>sql<span class="token punctuation">,</span> values<span class="token punctuation">)</span>    mydb<span class="token punctuation">.</span>commit<span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">print</span><span class="token punctuation">(</span>cursor<span class="token punctuation">.</span>rowcount<span class="token punctuation">,</span> <span class="token string">"records inserted."</span><span class="token punctuation">)</span><span class="token keyword">except</span> mysql<span class="token punctuation">.</span>connector<span class="token punctuation">.</span>Error <span class="token keyword">as</span> err<span class="token punctuation">:</span>    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Error during database interaction: </span><span class="token interpolation"><span class="token punctuation">{</span>err<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span><span class="token keyword">except</span> Exception <span class="token keyword">as</span> e<span class="token punctuation">:</span> <span class="token comment">#Catch any other unexpected errors</span>    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"An unexpected error occurred: </span><span class="token interpolation"><span class="token punctuation">{</span>e<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span><span class="token keyword">finally</span><span class="token punctuation">:</span>    <span class="token keyword">if</span> mydb <span class="token keyword">and</span> mydb<span class="token punctuation">.</span>is_connected<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>  <span class="token comment"># Check if mydb is defined and connected</span>        cursor<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span>        mydb<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="4-在navicat中创建图表"><a href="#4-在navicat中创建图表" class="headerlink" title="4. 在navicat中创建图表"></a>4. 在navicat中创建图表</h3><blockquote><p>数据入库之后就是将数据以图表方式展示了，这块可以直接用navicat的图表功能，无需编码就能快速创建图表了</p></blockquote><ul><li><p>4.1 图表中新建工作区</p><blockquote><p><img src="https://image.980712.xyz/file/1735291822464_image.png" alt="navicat中的图表功能"></p></blockquote></li><li><p>4.2 工作区中新建数据源</p><blockquote><p>可以编辑自己的查询语句，或者自行处理数据，这里我想把已用流量转换成GB形式显示，就这样处理。<br>  <img src="https://image.980712.xyz/file/1735292171777_image.png" alt="自定义查询"><br>拖动可以关联表，待会就能选中自定义的字段了，记得点击应用并刷新数据<br><img src="https://image.980712.xyz/file/1735292327373_image.png" alt="关联表"></p></blockquote></li><li><p>4.3 新建图表，数据源就选择我们刚刚创建的数据源，将需要的数据拖动到对应位置，即可生成对应的图表。</p><blockquote><p><img src="https://image.980712.xyz/file/1735292628532_image.png" alt="新建图表并设置字段"></p></blockquote></li><li><p>4.4 新建仪表板</p><blockquote><p>新建仪表板并将我们刚刚创建的图表拖动的仪表板中就大功告成啦<br><img src="https://image.980712.xyz/file/1735292830684_image.png" alt="将图表拖动到仪表板中"></p></blockquote></li></ul>]]></content>
    
    
    <summary type="html">利用青龙面板备份搬瓦工VPS信息，并利用navicat生成图表</summary>
    
    
    
    <category term="docker" scheme="https://blog.980712.xyz/categories/docker/"/>
    
    
    <category term="青龙" scheme="https://blog.980712.xyz/tags/%E9%9D%92%E9%BE%99/"/>
    
    <category term="VPS" scheme="https://blog.980712.xyz/tags/VPS/"/>
    
  </entry>
  
  <entry>
    <title>vue3 组合式api速查笔记</title>
    <link href="https://blog.980712.xyz/posts/2576025612.html"/>
    <id>https://blog.980712.xyz/posts/2576025612.html</id>
    <published>2024-07-26T01:47:00.000Z</published>
    <updated>2026-05-29T08:32:31.437Z</updated>
    
    <content type="html"><![CDATA[<h2 id="响应式声明"><a href="#响应式声明" class="headerlink" title="响应式声明"></a>响应式声明</h2><h3 id="ref"><a href="#ref" class="headerlink" title="ref()"></a><code>ref()</code></h3><ul><li>用来声明响应式状态，常用来包裹基础数据类型。也可以包裹层级不深的对象，script中使用时需要<code>.value</code>取值。<pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">import</span> <span class="token punctuation">{</span> ref <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span> <span class="token comment">//引用</span><span class="token keyword">const</span> count <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token comment">//声明</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>count<span class="token punctuation">.</span>value<span class="token punctuation">)</span> <span class="token comment">//在script中使用和修改实际值</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></li></ul><h3 id="reactive"><a href="#reactive" class="headerlink" title="reactive()"></a><code>reactive()</code></h3><ul><li>用于包裹对象类型的数据，与<code>ref</code>不同，不需要<code>.vlaue</code>取值。注意：不能直接对该对象重新赋值（修改引用地址），可以使用<code>Object.assign()</code>方法修改属性值。</li><li><code>reactive</code>中引用<code>ref</code>定义的数据时不需要<code>.value</code>获取实际值<pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">import</span> <span class="token punctuation">{</span> ref<span class="token punctuation">,</span> reactive <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span> <span class="token comment">//引用</span><span class="token keyword">const</span> count <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token keyword">const</span> state <span class="token operator">=</span> <span class="token function">reactive</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">count</span><span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token comment">//声明</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>state<span class="token punctuation">)</span> <span class="token comment">//直接使用</span>Object<span class="token punctuation">.</span><span class="token function">assign</span><span class="token punctuation">(</span>state<span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token literal-property property">count</span><span class="token operator">:</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">status</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">//修改值</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ul><h3 id="setup"><a href="#setup" class="headerlink" title="setup"></a><code>setup</code></h3><ul><li>使用&nbsp;<code>&lt;script setup&gt;</code>&nbsp;语法糖来大幅度地简化代码，</li><li>使用<code>vite-plugin-vue-setup-extend</code>插件快速设置组件的namespace<pre class="line-numbers language-vue" data-language="vue"><code class="language-vue">&lt;script setup name="ComponentName"&gt; // setup + 组件namespaceimport { ref } from 'vue'const count = ref(0)function increment() {  count.value++}&lt;/script&gt;&lt;template&gt;  &lt;button @click="increment"&gt;    {{ count }}  &lt;/button&gt;&lt;/template&gt;<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ul><h3 id="toRef和toRefs"><a href="#toRef和toRefs" class="headerlink" title="toRef和toRefs"></a><code>toRef</code>和<code>toRefs</code></h3><ul><li><code>toRef</code>将值、refs 或 getters 规范化为 refs。改变源属性的值将更新 ref 的值，反之亦然。</li><li><code>toRefs</code>将一个响应式对象转换为一个普通对象，这个普通对象的每个属性都是指向源对象相应属性的 ref。<pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">import</span> <span class="token punctuation">{</span> ref<span class="token punctuation">,</span> reactive<span class="token punctuation">,</span> toRef<span class="token punctuation">,</span> toRefs <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token keyword">const</span> state <span class="token operator">=</span> <span class="token function">reactive</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">foo</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">bar</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">// 双向 ref，会与源属性同步 </span><span class="token keyword">const</span> fooRef <span class="token operator">=</span> <span class="token function">toRef</span><span class="token punctuation">(</span>state<span class="token punctuation">,</span> <span class="token string">'foo'</span><span class="token punctuation">)</span> <span class="token comment">// 更改该 ref 会更新源属性 </span>fooRef<span class="token punctuation">.</span>value<span class="token operator">++</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>state<span class="token punctuation">.</span>foo<span class="token punctuation">)</span> <span class="token comment">// 2 </span><span class="token comment">// 更改源属性也会更新该 ref </span>state<span class="token punctuation">.</span>foo<span class="token operator">++</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>fooRef<span class="token punctuation">.</span>value<span class="token punctuation">)</span> <span class="token comment">// 3</span><span class="token keyword">const</span> state <span class="token operator">=</span> <span class="token function">reactive</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">foo</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">bar</span><span class="token operator">:</span> <span class="token number">2</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">// 可以解构而不会失去响应性 </span><span class="token keyword">const</span> <span class="token punctuation">{</span> foo<span class="token punctuation">,</span> bar <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">toRefs</span><span class="token punctuation">(</span>state<span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ul><h3 id="computed"><a href="#computed" class="headerlink" title="computed()"></a><code>computed()</code></h3><ul><li>接受一个&nbsp;<a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/get#description">getter 函数</a>，返回一个只读的响应式&nbsp;<a href="https://cn.vuejs.org/api/reactivity-core.html#ref">ref</a>&nbsp;对象。也可以接受一个带有&nbsp;<code>get</code>&nbsp;和&nbsp;<code>set</code>&nbsp;函数的对象来创建一个可写的 ref 对象。</li><li>有缓存，只会在使用和依赖的数据更新时调用一次。<pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">import</span> <span class="token punctuation">{</span>ref<span class="token punctuation">,</span> reactive<span class="token punctuation">,</span> computed<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token comment">// 只读 </span><span class="token keyword">const</span> count <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token keyword">const</span> plusOne <span class="token operator">=</span> <span class="token function">computed</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> count<span class="token punctuation">.</span>value <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>plusOne<span class="token punctuation">.</span>value<span class="token punctuation">)</span> <span class="token comment">// 2</span>plusOne<span class="token punctuation">.</span>value<span class="token operator">++</span> <span class="token comment">// 错误</span><span class="token comment">//可写</span><span class="token keyword">const</span> count <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token keyword">const</span> plusOne <span class="token operator">=</span> <span class="token function">computed</span><span class="token punctuation">(</span><span class="token punctuation">{</span>  <span class="token function-variable function">get</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> count<span class="token punctuation">.</span>value <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span>  <span class="token function-variable function">set</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token parameter">val</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>    count<span class="token punctuation">.</span>value <span class="token operator">=</span> val <span class="token operator">-</span> <span class="token number">1</span>  <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span>plusOne<span class="token punctuation">.</span>value <span class="token operator">=</span> <span class="token number">1</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>count<span class="token punctuation">.</span>value<span class="token punctuation">)</span> <span class="token comment">// 0</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ul><h3 id="watch"><a href="#watch" class="headerlink" title="watch()"></a><code>watch()</code></h3><ul><li>侦听一个或多个响应式数据源，并在数据源变化时调用所给的回调函数。<ol><li>第一个参数：被监听的对象，可以传入一个函数或数组。</li><li>第二个参数：监听的回调。</li><li>第三个参数：配置对象（deep：深度监听，immediate：创建时立即触发回调…）。</li></ol></li></ul><h4 id="一、ref定义的【基本类型】的数据。"><a href="#一、ref定义的【基本类型】的数据。" class="headerlink" title="一、ref定义的【基本类型】的数据。"></a>一、<code>ref</code>定义的【基本类型】的数据。</h4><pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">import</span> <span class="token punctuation">{</span>ref<span class="token punctuation">,</span> reactive<span class="token punctuation">,</span> watch<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token keyword">let</span> name <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token string">'tom'</span><span class="token punctuation">)</span><span class="token keyword">const</span> stopWatch <span class="token operator">=</span> <span class="token function">watch</span><span class="token punctuation">(</span>name<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">newValue<span class="token punctuation">,</span> oldValue</span><span class="token punctuation">)</span><span class="token operator">=&gt;</span><span class="token punctuation">{</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'name数据变化'</span><span class="token punctuation">,</span> newValue<span class="token punctuation">,</span> oldValue<span class="token punctuation">)</span><span class="token comment">// 停止监视</span><span class="token keyword">if</span> <span class="token punctuation">(</span>name <span class="token operator">==</span> <span class="token string">'jack'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">stopWatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h4 id="二、ref定义的【对象类型】的数据：直接写数据名，监听的是对象的地址值，若想监听对象内部的数据，要手动开启深度监听。"><a href="#二、ref定义的【对象类型】的数据：直接写数据名，监听的是对象的地址值，若想监听对象内部的数据，要手动开启深度监听。" class="headerlink" title="二、ref定义的【对象类型】的数据：直接写数据名，监听的是对象的地址值，若想监听对象内部的数据，要手动开启深度监听。"></a>二、<code>ref</code>定义的【对象类型】的数据：直接写数据名，监听的是对象的地址值，若想监听对象内部的数据，要手动开启深度监听。</h4><blockquote><p>注意<br>    - 若是修改ref定义的对象中的属性值，newValue和oldValue都是新值，因为他们都是同一个对象。<br>    - 若修改整个ref定义的对象，newValue是新值，oldValue是旧值，因为不是同一个对象。</p></blockquote><pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">import</span> <span class="token punctuation">{</span>ref<span class="token punctuation">,</span> reactive<span class="token punctuation">,</span> watch<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token keyword">let</span> person <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'tom'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token function">watch</span><span class="token punctuation">(</span>person<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">newValue<span class="token punctuation">,</span> oldValue</span><span class="token punctuation">)</span><span class="token operator">=&gt;</span><span class="token punctuation">{</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'name数据变化'</span><span class="token punctuation">,</span> newValue<span class="token punctuation">,</span> oldValue<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token literal-property property">deep</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">//开启深度监听</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><h4 id="三、reactive定义的【对象类型】数据，会默认开启深度监听"><a href="#三、reactive定义的【对象类型】数据，会默认开启深度监听" class="headerlink" title="三、reactive定义的【对象类型】数据，会默认开启深度监听"></a>三、<code>reactive</code>定义的【对象类型】数据，会默认开启深度监听</h4><h4 id="四、监听响应式对象中的某个树形，且该树形是基本类型，要写成函数式。"><a href="#四、监听响应式对象中的某个树形，且该树形是基本类型，要写成函数式。" class="headerlink" title="四、监听响应式对象中的某个树形，且该树形是基本类型，要写成函数式。"></a>四、监听响应式对象中的某个树形，且该树形是基本类型，要写成函数式。</h4><ul><li>监听的要是对象里的树形，<em><strong>最好写成函数式</strong></em>，注意点：若是对象监听的是地址值，需要关注对象内部，需要手动开启深度监听。<pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">import</span> <span class="token punctuation">{</span>ref<span class="token punctuation">,</span> reactive<span class="token punctuation">,</span> watch<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token keyword">let</span> person <span class="token operator">=</span> <span class="token function">reactive</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'tom'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token function">watch</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">=&gt;</span>person<span class="token punctuation">.</span>name<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">newValue<span class="token punctuation">,</span> oldValue</span><span class="token punctuation">)</span><span class="token operator">=&gt;</span><span class="token punctuation">{</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'name数据变化'</span><span class="token punctuation">,</span> newValue<span class="token punctuation">,</span> oldValue<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token literal-property property">deep</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">//开启深度监听</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ul><h4 id="五、监视以上多个数据"><a href="#五、监视以上多个数据" class="headerlink" title="五、监视以上多个数据"></a>五、监视以上多个数据</h4><pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">import</span> <span class="token punctuation">{</span>ref<span class="token punctuation">,</span> reactive<span class="token punctuation">,</span> watch<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token keyword">let</span> person <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'tom'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token keyword">let</span> name <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token string">'tom'</span><span class="token punctuation">)</span><span class="token function">watch</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">=&gt;</span>person<span class="token punctuation">.</span>name<span class="token punctuation">,</span> name<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">newValue<span class="token punctuation">,</span> oldValue</span><span class="token punctuation">)</span><span class="token operator">=&gt;</span><span class="token punctuation">{</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'name数据变化'</span><span class="token punctuation">,</span> newValue<span class="token punctuation">,</span> oldValue<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token literal-property property">deep</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">//开启深度监听</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="watchEffect"><a href="#watchEffect" class="headerlink" title="watchEffect"></a><code>watchEffect</code></h3><ul><li>立即运行一个函数，同时响应式地追踪其依赖，并在依赖更改时重新执行</li><li><code>watch</code>对比<code>watchEffect</code><blockquote><ol><li>都能监听响应式数据的变化，但是监听数据变化的方式不同。</li><li><code>watch</code>: 要明确指出监听的数据</li><li><code>watchEffect</code>: 不用明确指出监听的数据（函数中用到哪些树形，那就监听哪些树形）。</li></ol></blockquote><pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">import</span> <span class="token punctuation">{</span>ref<span class="token punctuation">,</span> reactive<span class="token punctuation">,</span> watchEffect<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token keyword">let</span> person <span class="token operator">=</span> <span class="token function">reactive</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'tom'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token keyword">let</span> name <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token string">'tom'</span><span class="token punctuation">)</span><span class="token function">watchEffect</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">=&gt;</span><span class="token punctuation">{</span><span class="token keyword">if</span> <span class="token punctuation">(</span>person<span class="token punctuation">.</span>name<span class="token operator">===</span>name<span class="token punctuation">.</span>value<span class="token punctuation">)</span> <span class="token punctuation">{</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'名称相同了'</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">//开启深度监听</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ul><h3 id="shallowRef-shallowReactive"><a href="#shallowRef-shallowReactive" class="headerlink" title="shallowRef() shallowReactive"></a><code>shallowRef()</code> <code>shallowReactive</code></h3><ul><li>shallowRef：<a href="https://cn.vuejs.org/api/reactivity-core.html#ref"><code>ref()</code></a>&nbsp;的浅层作用形式。</li><li>shallowReactive：<a href="https://cn.vuejs.org/api/reactivity-core.html#reactive"><code>reactive()</code></a>&nbsp;的浅层作用形式。</li></ul>]]></content>
    
    
    <summary type="html">vue3 组合式api 速查笔记</summary>
    
    
    
    <category term="前端" scheme="https://blog.980712.xyz/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="前端笔记" scheme="https://blog.980712.xyz/tags/%E5%89%8D%E7%AB%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Vue3" scheme="https://blog.980712.xyz/tags/Vue3/"/>
    
  </entry>
  
  <entry>
    <title>js图片裁剪和透明处理封装</title>
    <link href="https://blog.980712.xyz/posts/2712265996.html"/>
    <id>https://blog.980712.xyz/posts/2712265996.html</id>
    <published>2024-07-05T07:32:00.000Z</published>
    <updated>2026-05-29T08:32:29.244Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>记录下前端对于图片文件的方法封装，包括 File对象转base64、base64转File对象、去除图片背景色、清除图片周围空白区域</p></blockquote><p>起因是项目中遇到需要上传印章图片并自动截取有效印章区域并背景透明化处理。</p><h4 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h4><ul><li>首先通过<code>antd</code>组件的 <code>transformFile</code>方法获取到用户上传的file对象。</li><li>对图片进行去除图片背景的操作，对应方法为<code>removeImgBg</code>。</li><li>清除图片周围透明色区域，截取图片主体内容，方法<code>clearImageEdgeBlank</code>。</li><li>将返回的base64转为file对象，返回一个file对象和base64。方便业务取用。</li></ul><p>具体代码如下：</p><blockquote><p>index.jsx</p></blockquote><pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">import</span> <span class="token punctuation">{</span> Upload<span class="token punctuation">,</span> Button<span class="token punctuation">,</span> Icon <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'antd'</span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token punctuation">{</span>removeImgBg<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'utils'</span><span class="token keyword">const</span> props <span class="token operator">=</span> <span class="token punctuation">{</span>  action<span class="token operator">:</span> <span class="token string">'https://www.mocky.io/v2/5cc8019d300000980a055e76'</span><span class="token punctuation">,</span>  <span class="token function">transformFile</span><span class="token punctuation">(</span><span class="token parameter">file</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">resolve</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>      <span class="token function">removeImgBg</span><span class="token punctuation">(</span>file<span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">40</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">res</span><span class="token operator">=&gt;</span><span class="token punctuation">{</span>        <span class="token function">resolve</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span>file<span class="token punctuation">)</span>      <span class="token punctuation">}</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">)</span>  <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span class="token punctuation">;</span>ReactDOM<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span>  <span class="token operator">&lt;</span>div<span class="token operator">&gt;</span>    <span class="token operator">&lt;</span>Upload <span class="token punctuation">{</span><span class="token operator">...</span>props<span class="token punctuation">}</span><span class="token operator">&gt;</span>      <span class="token operator">&lt;</span>Button<span class="token operator">&gt;</span>        <span class="token operator">&lt;</span>Icon type<span class="token operator">=</span><span class="token string">"upload"</span> <span class="token operator">/</span><span class="token operator">&gt;</span> Upload      <span class="token operator">&lt;</span><span class="token operator">/</span>Button<span class="token operator">&gt;</span>    <span class="token operator">&lt;</span><span class="token operator">/</span>Upload<span class="token operator">&gt;</span>  <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span><span class="token punctuation">,</span>  mountNode<span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><blockquote><p>utils.js</p></blockquote><pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token comment">/** * File对象转base64 * @param file File对象 * @returns Promise */</span><span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">fileToBase64</span><span class="token punctuation">(</span><span class="token parameter">file</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">resolve<span class="token punctuation">,</span> reject</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>    <span class="token comment">// 创建一个新的 FileReader 对象</span>    <span class="token keyword">const</span> reader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileReader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment">// 读取 File 对象</span>    reader<span class="token punctuation">.</span><span class="token function">readAsDataURL</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment">// 加载完成后</span>    reader<span class="token punctuation">.</span><span class="token function-variable function">onload</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>      <span class="token comment">// 将读取的数据转换为 base64 编码的字符串</span>      <span class="token keyword">const</span> base64String <span class="token operator">=</span> reader<span class="token punctuation">.</span>result<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">","</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>      <span class="token comment">// 解析为 Promise 对象，并返回 base64 编码的字符串</span>      <span class="token function">resolve</span><span class="token punctuation">(</span>base64String<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">;</span>    <span class="token comment">// 加载失败时</span>    reader<span class="token punctuation">.</span><span class="token function-variable function">onerror</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>      <span class="token function">reject</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token string">"Failed to load file"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">;</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">/** * base64转File对象 * @param base64 base64编码 * @param fileName string 文件名 * @returns File */</span><span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">base64ToFile</span><span class="token punctuation">(</span><span class="token parameter">base64<span class="token punctuation">,</span> fileName</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  <span class="token keyword">let</span> arr <span class="token operator">=</span> base64<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">","</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token keyword">let</span> mime <span class="token operator">=</span> arr<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">match</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">^data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>  <span class="token keyword">let</span> bstr <span class="token operator">=</span> <span class="token function">atob</span><span class="token punctuation">(</span>arr<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token keyword">let</span> n <span class="token operator">=</span> bstr<span class="token punctuation">.</span>length<span class="token punctuation">;</span>  <span class="token keyword">let</span> u8arr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Uint8Array</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token keyword">while</span> <span class="token punctuation">(</span>n<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    u8arr<span class="token punctuation">[</span>n<span class="token punctuation">]</span> <span class="token operator">=</span> bstr<span class="token punctuation">.</span><span class="token function">charCodeAt</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token punctuation">}</span>  <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token punctuation">[</span>u8arr<span class="token punctuation">]</span><span class="token punctuation">,</span> fileName<span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token literal-property property">type</span><span class="token operator">:</span> mime <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">/** * 获取File图片信息 * @param fileObj Filee图片 * @returns imageObj imageObj对象 */</span><span class="token keyword">export</span> <span class="token keyword">function</span> <span class="token function">fileToImgObj</span><span class="token punctuation">(</span><span class="token parameter">fileObj</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">resolve<span class="token punctuation">,</span> reject</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>    <span class="token keyword">var</span> reader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileReader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    reader<span class="token punctuation">.</span><span class="token function">readAsDataURL</span><span class="token punctuation">(</span>fileObj<span class="token punctuation">)</span><span class="token punctuation">;</span>    reader<span class="token punctuation">.</span><span class="token function-variable function">onload</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">evt</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">var</span> replaceSrc <span class="token operator">=</span> evt<span class="token punctuation">.</span>target<span class="token punctuation">.</span>result<span class="token punctuation">;</span>        <span class="token keyword">var</span> imageObj <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Image</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        imageObj<span class="token punctuation">.</span>src <span class="token operator">=</span> replaceSrc<span class="token punctuation">;</span>        imageObj<span class="token punctuation">.</span><span class="token function-variable function">onload</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token function">resolve</span><span class="token punctuation">(</span>imageObj<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">;</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token comment">/** * 去除图片背景 * @param fileObj File文件 * @param rgba 去除色 * @param tolerance 容差值 * @returns File */</span><span class="token keyword">export</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">removeImgBg</span><span class="token punctuation">(</span><span class="token parameter">fileObj<span class="token punctuation">,</span> rgba<span class="token punctuation">,</span> tolerance</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  <span class="token keyword">var</span> imgData <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>  <span class="token keyword">const</span> <span class="token punctuation">[</span>r0<span class="token punctuation">,</span> g0<span class="token punctuation">,</span> b0<span class="token punctuation">,</span> a0<span class="token punctuation">]</span> <span class="token operator">=</span> rgba<span class="token punctuation">;</span>  <span class="token keyword">var</span> r<span class="token punctuation">,</span> g<span class="token punctuation">,</span> b<span class="token punctuation">,</span> a<span class="token punctuation">;</span>  <span class="token keyword">const</span> canvas <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'canvas'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token keyword">const</span> context <span class="token operator">=</span> canvas<span class="token punctuation">.</span><span class="token function">getContext</span><span class="token punctuation">(</span><span class="token string">'2d'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token keyword">const</span> imageObj <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">fileToImgObj</span><span class="token punctuation">(</span>fileObj<span class="token punctuation">)</span>  <span class="token keyword">const</span> w <span class="token operator">=</span> imageObj<span class="token punctuation">.</span>width<span class="token punctuation">;</span>  <span class="token keyword">const</span> h <span class="token operator">=</span> imageObj<span class="token punctuation">.</span>height<span class="token punctuation">;</span>  canvas<span class="token punctuation">.</span>width <span class="token operator">=</span> w<span class="token punctuation">;</span>  canvas<span class="token punctuation">.</span>height <span class="token operator">=</span> h<span class="token punctuation">;</span>  context<span class="token punctuation">.</span><span class="token function">drawImage</span><span class="token punctuation">(</span>imageObj<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  imgData <span class="token operator">=</span> context<span class="token punctuation">.</span><span class="token function">getImageData</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> w<span class="token punctuation">,</span> h<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> imgData<span class="token punctuation">.</span>data<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i <span class="token operator">+=</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>      r <span class="token operator">=</span> imgData<span class="token punctuation">.</span>data<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>      g <span class="token operator">=</span> imgData<span class="token punctuation">.</span>data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>      b <span class="token operator">=</span> imgData<span class="token punctuation">.</span>data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span>      a <span class="token operator">=</span> imgData<span class="token punctuation">.</span>data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span>      <span class="token keyword">const</span> t <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">sqrt</span><span class="token punctuation">(</span><span class="token punctuation">(</span>r <span class="token operator">-</span> r0<span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span> <span class="token operator">+</span> <span class="token punctuation">(</span>g <span class="token operator">-</span> g0<span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span> <span class="token operator">+</span> <span class="token punctuation">(</span>b <span class="token operator">-</span> b0<span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span> <span class="token operator">+</span> <span class="token punctuation">(</span>a <span class="token operator">-</span> a0<span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>      <span class="token keyword">if</span> <span class="token punctuation">(</span>t <span class="token operator">&lt;=</span> tolerance<span class="token punctuation">)</span> <span class="token punctuation">{</span>          imgData<span class="token punctuation">.</span>data<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>          imgData<span class="token punctuation">.</span>data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>          imgData<span class="token punctuation">.</span>data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>          imgData<span class="token punctuation">.</span>data<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>      <span class="token punctuation">}</span>  <span class="token punctuation">}</span>  context<span class="token punctuation">.</span><span class="token function">putImageData</span><span class="token punctuation">(</span>imgData<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token keyword">const</span> newBase64 <span class="token operator">=</span> canvas<span class="token punctuation">.</span><span class="token function">toDataURL</span><span class="token punctuation">(</span><span class="token string">'image/png'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token keyword">const</span> clearedBase64 <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">clearImageEdgeBlank</span><span class="token punctuation">(</span>newBase64<span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span>  <span class="token keyword">const</span> newFileObj <span class="token operator">=</span> <span class="token function">base64ToFile</span><span class="token punctuation">(</span>clearedBase64<span class="token punctuation">,</span> fileObj<span class="token punctuation">.</span>name<span class="token punctuation">)</span>  <span class="token keyword">const</span> transformedFile <span class="token operator">=</span> Object<span class="token punctuation">.</span><span class="token function">assign</span><span class="token punctuation">(</span>newFileObj<span class="token punctuation">,</span> <span class="token punctuation">{</span>    uid<span class="token operator">:</span> fileObj<span class="token punctuation">.</span>uid<span class="token punctuation">,</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token keyword">return</span> <span class="token punctuation">{</span>    file<span class="token operator">:</span> transformedFile<span class="token punctuation">,</span>    base<span class="token operator">:</span>  clearedBase64  <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment">/** * 清楚图片周围空白区域 * @param {string} url - 图片地址或base64 * @param {number} [padding=0] - 内边距 * @return {string} base64 - 裁剪后的图片字符串 */</span><span class="token keyword">function</span> <span class="token function">clearImageEdgeBlank</span><span class="token punctuation">(</span><span class="token parameter">url<span class="token punctuation">,</span> padding <span class="token operator">=</span> <span class="token number">0</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">resolve<span class="token punctuation">,</span> reject</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>    <span class="token comment">// create canvas</span>    <span class="token keyword">const</span> canvas <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">"canvas"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> ctx <span class="token operator">=</span> canvas<span class="token punctuation">.</span><span class="token function">getContext</span><span class="token punctuation">(</span><span class="token string">"2d"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment">// create image</span>    <span class="token keyword">const</span> image <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Image</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    image<span class="token punctuation">.</span>onload <span class="token operator">=</span> draw<span class="token punctuation">;</span>    image<span class="token punctuation">.</span>src <span class="token operator">=</span> url<span class="token punctuation">;</span>    image<span class="token punctuation">.</span>crossOrigin <span class="token operator">=</span> <span class="token string">"Anonymous"</span><span class="token punctuation">;</span>    <span class="token keyword">function</span> <span class="token function">draw</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>      canvas<span class="token punctuation">.</span>width <span class="token operator">=</span> image<span class="token punctuation">.</span>width<span class="token punctuation">;</span>      canvas<span class="token punctuation">.</span>height <span class="token operator">=</span> image<span class="token punctuation">.</span>height<span class="token punctuation">;</span>      ctx<span class="token punctuation">.</span><span class="token function">drawImage</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> canvas<span class="token punctuation">.</span>width<span class="token punctuation">,</span> canvas<span class="token punctuation">.</span>height<span class="token punctuation">)</span><span class="token punctuation">;</span>      <span class="token keyword">const</span> imageData <span class="token operator">=</span> ctx<span class="token punctuation">.</span><span class="token function">getImageData</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> canvas<span class="token punctuation">.</span>width<span class="token punctuation">,</span> canvas<span class="token punctuation">.</span>height<span class="token punctuation">)</span><span class="token punctuation">;</span>      <span class="token keyword">const</span> <span class="token punctuation">{</span> data<span class="token punctuation">,</span> width<span class="token punctuation">,</span> height <span class="token punctuation">}</span> <span class="token operator">=</span> imageData<span class="token punctuation">;</span>      <span class="token comment">// 裁剪需要的起点和终点,初始值为画布左上和右下点互换设置成极限值。</span>      <span class="token keyword">let</span> startX <span class="token operator">=</span> width<span class="token punctuation">,</span>        startY <span class="token operator">=</span> height<span class="token punctuation">,</span>        endX <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span>        endY <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>      <span class="token comment">/*      col为列，row为行，两层循环构造每一个网格，      便利所有网格的像素，如果有色彩则设置裁剪的起点和终点      */</span>      console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'开始'</span><span class="token punctuation">)</span>      <span class="token keyword">const</span> startTime <span class="token operator">=</span> Date<span class="token punctuation">.</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>      <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> col <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> col <span class="token operator">&lt;</span> width<span class="token punctuation">;</span> col<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> row <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> row <span class="token operator">&lt;</span> height<span class="token punctuation">;</span> row<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment">// 网格索引</span>          <span class="token keyword">const</span> pxStartIndex <span class="token operator">=</span> <span class="token punctuation">(</span>row <span class="token operator">*</span> width <span class="token operator">+</span> col<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">4</span><span class="token punctuation">;</span>          <span class="token comment">// 网格的实际像素RGBA</span>          <span class="token keyword">const</span> pxData <span class="token operator">=</span> <span class="token punctuation">{</span>            r<span class="token operator">:</span> data<span class="token punctuation">[</span>pxStartIndex<span class="token punctuation">]</span><span class="token punctuation">,</span>            g<span class="token operator">:</span> data<span class="token punctuation">[</span>pxStartIndex <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>            b<span class="token operator">:</span> data<span class="token punctuation">[</span>pxStartIndex <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>            a<span class="token operator">:</span> data<span class="token punctuation">[</span>pxStartIndex <span class="token operator">+</span> <span class="token number">3</span><span class="token punctuation">]</span>          <span class="token punctuation">}</span><span class="token punctuation">;</span>          <span class="token comment">// 存在色彩：不透明</span>          <span class="token keyword">const</span> colorExist <span class="token operator">=</span> pxData<span class="token punctuation">.</span>a <span class="token operator">!==</span> <span class="token number">0</span><span class="token punctuation">;</span>          <span class="token comment">/*          如果当前像素点有色彩          startX坐标取当前col和startX的最小值          endX坐标取当前col和endX的最大值          startY坐标取当前row和startY的最小值          endY坐标取当前row和endY的最大值          */</span>          <span class="token keyword">if</span> <span class="token punctuation">(</span>colorExist<span class="token punctuation">)</span> <span class="token punctuation">{</span>            startX <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">min</span><span class="token punctuation">(</span>col<span class="token punctuation">,</span> startX<span class="token punctuation">)</span><span class="token punctuation">;</span>            endX <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">max</span><span class="token punctuation">(</span>col<span class="token punctuation">,</span> startX<span class="token punctuation">)</span><span class="token punctuation">;</span>            startY <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">min</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> startY<span class="token punctuation">)</span><span class="token punctuation">;</span>            endY <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">max</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> endY<span class="token punctuation">)</span><span class="token punctuation">;</span>          <span class="token punctuation">}</span>        <span class="token punctuation">}</span>      <span class="token punctuation">}</span>      <span class="token keyword">const</span> interval <span class="token operator">=</span> Date<span class="token punctuation">.</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> startTime<span class="token punctuation">;</span>      console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'总共耗时'</span><span class="token punctuation">,</span> interval<span class="token punctuation">)</span><span class="token punctuation">;</span>      <span class="token comment">// 右下坐标需要扩展1px,才能完整的截取到图像</span>      endX <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span>      endY <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span>      <span class="token comment">// 加上padding</span>      startX <span class="token operator">-=</span> padding<span class="token punctuation">;</span>      startY <span class="token operator">-=</span> padding<span class="token punctuation">;</span>      endX <span class="token operator">+=</span> padding<span class="token punctuation">;</span>      endY <span class="token operator">+=</span> padding<span class="token punctuation">;</span>      <span class="token comment">// 根据计算的起点终点进行裁剪</span>      <span class="token keyword">const</span> cropCanvas <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">"canvas"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>      <span class="token keyword">const</span> cropCtx <span class="token operator">=</span> cropCanvas<span class="token punctuation">.</span><span class="token function">getContext</span><span class="token punctuation">(</span><span class="token string">"2d"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>      cropCanvas<span class="token punctuation">.</span>width <span class="token operator">=</span> endX <span class="token operator">-</span> startX<span class="token punctuation">;</span>      cropCanvas<span class="token punctuation">.</span>height <span class="token operator">=</span> endY <span class="token operator">-</span> startY<span class="token punctuation">;</span>      cropCtx<span class="token punctuation">.</span><span class="token function">drawImage</span><span class="token punctuation">(</span>        image<span class="token punctuation">,</span>        startX<span class="token punctuation">,</span>        startY<span class="token punctuation">,</span>        cropCanvas<span class="token punctuation">.</span>width<span class="token punctuation">,</span>        cropCanvas<span class="token punctuation">.</span>height<span class="token punctuation">,</span>        <span class="token number">0</span><span class="token punctuation">,</span>        <span class="token number">0</span><span class="token punctuation">,</span>        cropCanvas<span class="token punctuation">.</span>width<span class="token punctuation">,</span>        cropCanvas<span class="token punctuation">.</span>height      <span class="token punctuation">)</span><span class="token punctuation">;</span>      <span class="token comment">// rosolve裁剪后的图像字符串</span>      <span class="token function">resolve</span><span class="token punctuation">(</span>cropCanvas<span class="token punctuation">.</span><span class="token function">toDataURL</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>效果预览</p><table><thead><tr><th><center>befor</center></th><th align="right"><center>after</center></th></tr></thead><tbody><tr><td><img src="https://image.980712.xyz/file/d912bd183ba52bf00b615.png" alt="before" title="before"></td><td align="right"><img src="https://image.980712.xyz/file/19c7fa1c08f7174d3a57c.png" alt="after" title="after"></td></tr></tbody></table>]]></content>
    
    
    <summary type="html">React+antd下上传图片前使用js对图片进行背景图透明化处理，以及对图片主体内容进行裁剪。</summary>
    
    
    
    <category term="前端" scheme="https://blog.980712.xyz/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="前端笔记" scheme="https://blog.980712.xyz/tags/%E5%89%8D%E7%AB%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="React" scheme="https://blog.980712.xyz/tags/React/"/>
    
  </entry>
  
  <entry>
    <title>PNPM的使用</title>
    <link href="https://blog.980712.xyz/posts/6809.html"/>
    <id>https://blog.980712.xyz/posts/6809.html</id>
    <published>2024-05-12T06:02:00.000Z</published>
    <updated>2026-05-29T08:32:41.507Z</updated>
    
    <content type="html"><![CDATA[<h3 id="一-、NPMP包管理工具"><a href="#一-、NPMP包管理工具" class="headerlink" title="一 、NPMP包管理工具"></a>一 、NPMP包管理工具</h3><h4 id="pnpm-介绍"><a href="#pnpm-介绍" class="headerlink" title="pnpm 介绍"></a>pnpm 介绍</h4><blockquote><p><code>pnpm</code> 指 <code>performant npm</code>（高性能的 npm），如 <a href="https://pnpm.io/">pnpm 官网</a>所言，它是<strong>快速的，节省磁盘空间的包管理工具</strong>，同时，它也较好地支持了 <code>workspace</code> 和 <code>monorepos</code>。</p></blockquote><blockquote><p>​举例来说，如果项目中，你使用了某个依赖项的多个版本，那么 <code>pnpm</code> 只会将有差异的文件添加到仓库。如果某个依赖包有 100 个文件，而它的新版本只改变了其中 1 个文件。那么 <code>pnpm update</code> 时只会添加 1 个新文件，而不会复制整个新版本的所有包。此外。所有文件都会存储在硬盘上的某一位置。 当依赖包被被安装时，其中的文件会硬链接到这一位置，而不会占用额外的磁盘空间。同时，项目中允许共享同一版本的依赖。接下来我们先了解下 <code>pnpm</code> 的使用效果</p></blockquote><h4 id="安装配置"><a href="#安装配置" class="headerlink" title="安装配置"></a>安装配置</h4><blockquote><p>使用 PowerShell安装：</p></blockquote><pre class="line-numbers language-powershell" data-language="powershell"><code class="language-powershell"><span class="token function">iwr</span> https:<span class="token operator">/</span><span class="token operator">/</span>get<span class="token punctuation">.</span>pnpm<span class="token punctuation">.</span>io/install<span class="token punctuation">.</span>ps1 <span class="token operator">-</span>useb <span class="token punctuation">|</span> <span class="token function">iex</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><blockquote><p>使用npm安装（Node.js版本需v14及以上）</p></blockquote><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">npm</span> <span class="token function">install</span> <span class="token parameter variable">-g</span> <span class="token function">pnpm</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><blockquote><p>设置仓库地址</p></blockquote><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">pnpm</span> config <span class="token builtin class-name">set</span> store-dir path-to/your-dir<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><blockquote><p>以下是各版本 pnpm 与各版本 Node.js 之间的支持表格。</p></blockquote><table><thead><tr><th>Node.js</th><th>pnpm 4</th><th>pnpm 5</th><th>pnpm 6</th><th>pnpm 7</th></tr></thead><tbody><tr><td>Node.js 10</td><td>✔️</td><td>✔️</td><td>❌</td><td>❌</td></tr><tr><td>Node.js 12</td><td>✔️</td><td>✔️</td><td>✔️</td><td>❌</td></tr><tr><td>Node.js 14</td><td>✔️</td><td>✔️</td><td>✔️</td><td>✔️</td></tr><tr><td>Node.js 16</td><td>未知</td><td>未知</td><td>✔️</td><td>✔️</td></tr><tr><td>Node.js 18</td><td>未知</td><td>未知</td><td>✔️</td><td>✔️</td></tr></tbody></table><h4 id="pnpm-效果"><a href="#pnpm-效果" class="headerlink" title="pnpm 效果"></a>pnpm 效果</h4><blockquote><p>与 <code>npm</code>、<code>yarn</code>、<code>yarn pnp</code> 工具链效果对比，来自 <a href="https://pnpm.io/zh/benchmarks">pnpm benchmarks</a></p></blockquote><table><thead><tr><th align="center">action</th><th>cache</th><th>lockfile</th><th align="center">node_modules</th><th align="center">npm</th><th>pnpm</th><th align="center">Yarn</th><th align="center">Yarn PnP</th></tr></thead><tbody><tr><td align="center">install</td><td></td><td></td><td align="center"></td><td align="center">1m 9.5s</td><td>15.3s</td><td align="center">16.6s</td><td align="center">23.6s</td></tr><tr><td align="center">install</td><td>✔</td><td>✔</td><td align="center">✔</td><td align="center">2.4s</td><td>1.3s</td><td align="center">2.3s</td><td align="center">n/a</td></tr><tr><td align="center">install</td><td>✔</td><td>✔</td><td align="center"></td><td align="center">14.8s</td><td>4s</td><td align="center">6.8s</td><td align="center">1.5s</td></tr><tr><td align="center">install</td><td>✔</td><td></td><td align="center"></td><td align="center">21.8s</td><td>8.9s</td><td align="center">11.2s</td><td align="center">6.2s</td></tr><tr><td align="center">install</td><td></td><td>✔</td><td align="center"></td><td align="center">35.4s</td><td>13.4s</td><td align="center">12s</td><td align="center">17.9s</td></tr><tr><td align="center">install</td><td>✔</td><td></td><td align="center">✔</td><td align="center">3.1s</td><td>1.9s</td><td align="center">7s</td><td align="center">n/a</td></tr><tr><td align="center">install</td><td></td><td>✔</td><td align="center">✔</td><td align="center">2.4s</td><td>1.3s</td><td align="center">7.6s</td><td align="center">n/a</td></tr><tr><td align="center">install</td><td></td><td></td><td align="center">✔</td><td align="center">3s</td><td>6.1s</td><td align="center">11.8s</td><td align="center">n/a</td></tr><tr><td align="center">update</td><td>n/a</td><td>n/a</td><td align="center">n/a</td><td align="center">2.3s</td><td>11.8s</td><td align="center">15.5s</td><td align="center">28.3s</td></tr></tbody></table><p>从上表数据我们可以看出，<code>pnpm</code> 的各项性能均比其它包管理工具有优势，为什么 <code>pnpm</code> 有如此优越的表现？</p><h4 id="pnpm-的原理"><a href="#pnpm-的原理" class="headerlink" title="pnpm 的原理"></a><code>pnpm</code> 的原理</h4><p><code>pnpm</code> 主要有两个不同与其包管理工具的特性：</p><p><strong>基于硬链接的 <code>node_modules</code></strong></p><p><code>pnpm</code> 创建从全局存储到项目中 <code>node_modules</code> 文件夹的<a href="https://zh.wikipedia.org/wiki/%E7%A1%AC%E9%93%BE%E6%8E%A5">硬链接</a>，而硬链接指向磁盘上原始文件所在的同一位置，具体来说就是 <code>node_modules</code> 中每个包的每个文件都是来自<a href="https://en.wikipedia.org/wiki/Content-addressable_storage">内容可寻址存储</a>的硬链接，简言之，就是特定版本和名称的包全局只有一份。举例来看：</p><pre class="line-numbers language-none"><code class="language-none">node_modules└── .pnpm    ├── bar@1.0.0    │   └── node_modules    │       └── bar -&gt; &lt;store&gt;/bar    │           ├── index.js    │           └── package.json    └── foo@1.0.0        └── node_modules            └── foo -&gt; &lt;store&gt;/foo                ├── index.js                └── package.json<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><code>node_modules</code> 下面的唯一文件夹叫做 <code>.pnpm</code>, <code>.pnpm</code> 下面是一个 <code>&lt;PACKAGE_NAME＠VERSION&gt;</code> 文件夹，而在其下面 <code>&lt;PACKAGE_NAME&gt;</code> 的文件夹是一个基于内容可寻址存储的硬链接。同时，我们也可以通过 <code>pnpm root</code> 命令来打印当前项目中存放模块（modules）的有效目录</p><p><strong>基于依赖解析的软链接 <code>symlinks</code></strong></p><p>观察以下依赖包结构</p><pre class="line-numbers language-none"><code class="language-none">node_modules├── foo -&gt; ./.pnpm/foo@1.0.0/node_modules/foo└── .pnpm    ├── bar@1.0.0    │   └── node_modules    │       └── bar -&gt; &lt;store&gt;/bar    └── foo@1.0.0        └── node_modules            ├── foo -&gt; &lt;store&gt;/foo            └── bar -&gt; ../../bar@1.0.0/node_modules/bar<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>我们可以看到在 <code>foo@1.0.0/node_modules/bar</code> 内引用了 <code>bar</code> 的软链接 <code>../../bar@1.0.0/node_modules/bar</code>，而在项目里引用 <code>foo</code> 的软链接 <code>./.pnpm/foo@1.0.0/node_modules/foo</code>，如果项目内新增一个依赖包 <code>qar@2.0.0</code>，则其引用结构如下：</p><pre class="line-numbers language-none"><code class="language-none">node_modules├── foo -&gt; ./.pnpm/foo@1.0.0/node_modules/foo└── .pnpm    ├── bar@1.0.0    │   └── node_modules    │       ├── bar -&gt; &lt;store&gt;/bar    │       └── qar -&gt; ../../qar@2.0.0/node_modules/qar    ├── foo@1.0.0    │   └── node_modules    │       ├── foo -&gt; &lt;store&gt;/foo    │       ├── bar -&gt; ../../bar@1.0.0/node_modules/bar    │       └── qar -&gt; ../../qar@2.0.0/node_modules/qar    └── qar@2.0.0        └── node_modules            └── qar -&gt; &lt;store&gt;/qar<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>根据前文我们介绍到的<a href="https://nodejs.org/api/modules.html#all-together"><code>Nodejs</code>的依赖解析规则</a>，<code>foo@1.0.0/node_modules/foo/index.js</code> 中所需的依赖包 <code>bar</code>，实际上使用的是<code>bar@1.0.0/node_modules/bar</code>中的内容，因此，只有<strong>真正在依赖项中的包才能被访问到</strong>。而对于不同的 <code>peer dependencies</code> 的依赖解析原理，可以参考这里 <a href="https://pnpm.io/zh/how-peers-are-resolved">How peers are resolved</a></p><p>通过**基于硬链接的<code>node_modules</code>**和**基于依赖解析的软链接**原理，我们了解到，当我们在相同操作系统下第二次安装同一个依赖包时，我们需要做的仅仅是创建一个该依赖包对应的硬链接，对于同一个依赖包的不同版本，也只有不同的部分会被重新保存起来，而具体有没有 <code>pnpm</code> 是在哪里判断的呢？全局的 <code>pnpm</code> 索引文件在 <code>～/.pnpm-store/v3/files</code>。基于此，使用硬链接让依赖包的安装速度非常快，同时也去除了冗余，节省较大磁盘空间。</p><blockquote><p><a href="https://zh.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5">symlinks 符号连接</a></p></blockquote><h4 id="实际应用"><a href="#实际应用" class="headerlink" title="实际应用"></a>实际应用</h4><blockquote><ol><li>执行<code>pnpm i</code>，</li><li>执行<code>pnpm run uno</code> <code>package.json</code>文件修改后取消安装，</li><li>执行<code>pnpm i</code>命令后等待依赖导入完成。</li><li>执行<code>npm run start</code></li></ol></blockquote><details><summary>此时你会发现...</summary>项目报错找不到依赖文件<img src="https://store.980712.xyz/d/%E5%9B%BE%E5%BA%8A/pnpm-emoji.jpg?sign=7_u_NXMgwayMSQzwR1VsDdoUBm3uTOnqQTZBcLFdBpk=:0" alt="image.png" style="zoom: 25%;"><img src="https://store.980712.xyz/d/%E5%9B%BE%E5%BA%8A/pnpm-error.jpg?sign=L7YdZAT7lQ9V5TBk7Uk9K1aOzr4x53sY7eyhG0UPyM8=:0" alt="image.png" style="zoom: 67%;"></details><blockquote><p>查找资料发现，<code>yarn</code> 和 <code>npm</code> 会将所有依赖平铺在 <code>node_modules</code>，在项目中可以访问任何依赖的包。默认配置的 <code>pnpm</code> 创建 <code>node_modules</code> 时不会平铺依赖，我们需要将依赖提升至<code>node_modules</code>根目录。</p></blockquote><p><strong>在安装依赖之前我们需要先配置项目</strong></p><blockquote><ol><li>在项目根目录创建 <code>.npmrc</code>文件，添加如下配置，此配置会将所有内容提升到<code>node_modules</code>的根目录。</li><li>执行<code>pnpm i</code>，</li><li>执行<code>pnpm run uno</code> ，在<code>package.json</code>文件修改后取消安装，</li><li>执行<code>pnpm i</code>命令后等待依赖导入完成。</li><li>执行<code>npm run start</code></li></ol></blockquote><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml">auto<span class="token punctuation">-</span>install<span class="token punctuation">-</span>peers=true <span class="token comment"># 是否自动下载peer依赖项</span>shamefully<span class="token punctuation">-</span>hoist=true <span class="token comment"># 是否将所有依赖包平铺在node_modules</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p><a href="https://pnpm.io/zh/how-peers-are-resolved">peers依赖项文档</a><br><a href="https://pnpm.io/zh/npmrc#shamefully-hoist">shamefully-hoist配置文档</a></p><blockquote><p>如果明确知道需要提升的包名，可以按如下设置：</p></blockquote><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml">public<span class="token punctuation">-</span>hoist<span class="token punctuation">-</span>pattern<span class="token punctuation">[</span><span class="token punctuation">]</span>=momentpublic<span class="token punctuation">-</span>hoist<span class="token punctuation">-</span>pattern<span class="token punctuation">[</span><span class="token punctuation">]</span>=@umijs/*public<span class="token punctuation">-</span>hoist<span class="token punctuation">-</span>pattern<span class="token punctuation">[</span><span class="token punctuation">]</span>=antdpublic<span class="token punctuation">-</span>hoist<span class="token punctuation">-</span>pattern<span class="token punctuation">[</span><span class="token punctuation">]</span>=umi<span class="token punctuation">-</span>request<span class="token punctuation">...</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><h4 id="缺陷"><a href="#缺陷" class="headerlink" title="缺陷"></a>缺陷</h4><p><code>Pnpm</code> 不能跨多个驱动器或文件系统工作</p><p>包存储应与安装的位置处于同一驱动器和文件系统上，否则，包将被复制，而不是被链接。 这是由于硬链接的工作方式带来的一个限制，因为一个文件系统上的文件无法寻址另一个文件系统中的位置。 有关更多详细信息，请参阅 <a href="https://github.com/pnpm/pnpm/issues/712">issue #712</a>。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;一-、NPMP包管理工具&quot;&gt;&lt;a href=&quot;#一-、NPMP包管理工具&quot; class=&quot;headerlink&quot; title=&quot;一 、NPMP包管理工具&quot;&gt;&lt;/a&gt;一 、NPMP包管理工具&lt;/h3&gt;&lt;h4 id=&quot;pnpm-介绍&quot;&gt;&lt;a href=&quot;#pnpm-介</summary>
      
    
    
    
    <category term="前端" scheme="https://blog.980712.xyz/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="前端笔记" scheme="https://blog.980712.xyz/tags/%E5%89%8D%E7%AB%AF%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>【转】如何低价注册域名</title>
    <link href="https://blog.980712.xyz/posts/1348.html"/>
    <id>https://blog.980712.xyz/posts/1348.html</id>
    <published>2024-05-12T06:01:00.000Z</published>
    <updated>2026-05-29T08:32:42.131Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>文章来源：<a href="https://sao.ren/949.html">https://sao.ren/949.html</a><br>注册商域名注册价格都不相同，我们注册域名时如何找寻最低价格入手呢？（例如：国内网域注册商有阿里云、腾讯云、新网、西部数码等）</p></blockquote><ol><li>通过比价网站查询域名注册价格。</li></ol><p>国内比价网站：<a href="http://www.nazhumi.com/">www.Nazhumi.com</a></p><p>国外比价网站：<a href="http://www.tld-list.com/">www.tld-list.com</a></p><p>国外比价网站：<a href="http://www.whtop.com/">www.whtop.com</a> （全球最大虚拟主机目录，他们提供全球各地主机商信息，也会提供域名注册服务。whtop查找两位国别后缀比较有用。你在网站输入CN，点击Try Google Custom Search for whtop.com下面Top 10 in China，国内有名的域名注册商便会详细呈现）</p><p>上述网站，你只需输入域名后缀，货比三家，一目了然。当然，此法也并非完美无瑕。</p><ol start="2"><li>在注册局官网购买域名。</li></ol><p>注册局管理注册商，我们可以通过注册局官网了解所有注册商信息，部分注册局也出售域名，价格相对低廉。</p><p>注册局官方网站一般为NIC.域名后缀。如果NIC.域名后缀无法正常访问，大家可以访问 <a href="http://www.iana.org/domains/root/db/xxxx.html">www.iana.org/domains/root/db/xxxx.html</a> ，将xxxx改为域名后缀，此页面底部会显示注册局信息。</p><ol start="3"><li>时刻关注域名注册优惠信息。</li></ol><p>国内部分域名注册商新用户首年注册价格优惠、节庆经常赠送礼券，域名低价转入活动等。</p><p>注册域名，我们不仅要考虑价格，更要考虑注册商服务质量以及技术水平（比如客服及时响应用户解决域名出售、域名转移、DNS修改等问题）。</p><p>注册常见域名后缀，阿里云就够了，腾讯云为抢占市场，新用户可使用首年优惠，老用户注意抢券续费。国别后缀，本人推荐国内趣域网：Quyu.net ，电脑技术水平较好的用户可以比价选择外国注册商（支付需要全币种信用卡，建议使用Paypal支付）个人推荐：猪肉排：Porkbun.com 以及 dynadot.com 。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;文章来源：&lt;a href=&quot;https://sao.ren/949.html&quot;&gt;https://sao.ren/949.html&lt;/a&gt;&lt;br&gt;注册商域名注册价格都不相同，我们注册域名时如何找寻最低价格入手呢？（例如：国内网域注册商有阿里云、腾讯云</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.980712.xyz/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="运维" scheme="https://blog.980712.xyz/tags/%E8%BF%90%E7%BB%B4/"/>
    
  </entry>
  
  <entry>
    <title>利用github codespaces打包WSA并上传到阿里云盘</title>
    <link href="https://blog.980712.xyz/posts/12197.html"/>
    <id>https://blog.980712.xyz/posts/12197.html</id>
    <published>2022-12-08T13:27:09.000Z</published>
    <updated>2023-02-22T12:01:02.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="如题，本文将介绍如何白嫖GitHub-Codespaces编译项目并上传阿里云盘"><a href="#如题，本文将介绍如何白嫖GitHub-Codespaces编译项目并上传阿里云盘" class="headerlink" title="如题，本文将介绍如何白嫖GitHub Codespaces编译项目并上传阿里云盘"></a>如题，本文将介绍如何白嫖<code>GitHub Codespaces</code>编译项目并上传阿里云盘</h2><blockquote><p>最近想升级下电脑上的WSA，遂打开了GitHub找到<a href="https://github.com/LSPosed/MagiskOnWSALocal">MagiskOnWSALocal</a>准备打包，但是在本机的WSL上怎么也没法安装依赖正常编译。没办法探索出了这个方法。<br>先简要说下思路。   </p><ul><li>先利用<code>GitHub Codespaces</code>免费给的Linux环境打包好你需要的项目</li><li>之后再利用大佬的<a href="https://github.com/aoaostar/alidrive-uploader">alidrive-uploader</a>工具将编译完成的文件上传阿里云盘。</li></ul><p>可以解决编译项目时本地的各种环境问题。</p></blockquote><h2 id="下面是具体步骤"><a href="#下面是具体步骤" class="headerlink" title="下面是具体步骤"></a>下面是具体步骤</h2><p><img src="https://image.980712.xyz/file/a395bfa9fccce4fa5c562.png" alt="点击GitHub header上的Codespaces"></p><center style="font-size:14px;color:#C0C0C0;text-decoration:underline">点击GitHub header上的Codespaces</center> <p><img src="https://store.980712.xyz/d/%E5%9B%BE%E5%BA%8A/codespaces-compile-2.jpg?sign=S0wReIT8tOhSbwMHn7c4COy57aMynOiqjvQrP4fivSE=:0" alt="点击新建codespace"></p><center style="font-size:14px;color:#C0C0C0;text-decoration:underline">点击新建codespace</center> <p><img src="https://image.980712.xyz/file/383cc159764226cbfe6f4.jpg" alt="点击创建codespace"></p><center style="font-size:14px;color:#C0C0C0;text-decoration:underline">点击创建codespace</center> <p><img src="https://image.980712.xyz/file/e752bcc11ca2b57e516c1.jpg" alt="点击三个点在VSCode中打开"></p><center style="font-size:14px;color:#C0C0C0;text-decoration:underline">点击三个点在VSCode中打开</center> <p><img src="https://image.980712.xyz/file/83e1709e36307ceaabe1c.jpg" alt="打开控制台"></p><center style="font-size:14px;color:#C0C0C0;text-decoration:underline">打开控制台</center> <h2 id="打包MagiskOnWSALocal项目"><a href="#打包MagiskOnWSALocal项目" class="headerlink" title="打包MagiskOnWSALocal项目"></a>打包<a href="https://github.com/LSPosed/MagiskOnWSALocal">MagiskOnWSALocal</a>项目</h2><ul><li>首先拉取<code>MagiskOnWSALocal</code>代码,然后执行打包命令：<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">cd</span> /workspaces<span class="token function">git</span> clone https://github.com/LSPosed/MagiskOnWSALocal<span class="token builtin class-name">cd</span> MagiskOnWSALocalscripts/run.sh<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre></li><li>下一步根据自己的需求选择打包的WSA内容，最后一步输出文件选择打包成<code>.7z</code>压缩文件，方便我们下一步上传到阿里云，</li><li>等待依赖安装和打包下载之际我们可以再开一个控制台进行上传阿里云的准备工作。</li></ul><h2 id="下载alidrive-uploader"><a href="#下载alidrive-uploader" class="headerlink" title="下载alidrive-uploader"></a>下载<a href="https://github.com/aoaostar/alidrive-uploader">alidrive-uploader</a></h2><ul><li>之后下载 <a href="https://github.com/aoaostar/alidrive-uploader">alidrive-uploader</a>，配置好<code>conf.yaml</code>文件，项目内有使用方法，这里不再赘述。</li></ul><pre class="line-numbers language-shbashell" data-language="shbashell"><code class="language-shbashell">curl -sL https://raw.githubusercontent.com/aoaostar/alidrive-uploader/v2/install.sh | bash cd alidrive_uploader_linux_amd64/chmod +x alidrive<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h2 id="确认打包成功完成并上传文件"><a href="#确认打包成功完成并上传文件" class="headerlink" title="确认打包成功完成并上传文件"></a>确认打包成功完成并上传文件</h2><ul><li>切换到打包WSA的控制台查看是否已经完成打包，编译成功后会在output目录生成一个7z文件，复制下它的路径</li></ul><p><img src="https://image.980712.xyz/file/42f75ec3f263e7844f9b9.jpg" alt="编译成功"></p><center style="font-size:14px;color:#C0C0C0;text-decoration:underline">编译成功</center> <ul><li>最后切换到<code>alidrive-uploader</code>的控制台，运行命令，等待上传完毕就可以了。</li></ul><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">./alidrive WSA编译后生成的文件路径 希望在阿里云保存的路径<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p><img src="https://image.980712.xyz/file/77656e033291315e0e40f.jpg" alt="上传阿里云盘"></p><center style="font-size:14px;color:#C0C0C0;text-decoration:underline">上传阿里云盘</center> ]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;如题，本文将介绍如何白嫖GitHub-Codespaces编译项目并上传阿里云盘&quot;&gt;&lt;a href=&quot;#如题，本文将介绍如何白嫖GitHub-Codespaces编译项目并上传阿里云盘&quot; class=&quot;headerlink&quot; title=&quot;如题，本文将介绍如何白嫖</summary>
      
    
    
    
    <category term="随笔" scheme="https://blog.980712.xyz/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="GitHub" scheme="https://blog.980712.xyz/tags/GitHub/"/>
    
    <category term="随笔" scheme="https://blog.980712.xyz/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>雷鸟电视通过手机adb安装第三方应用</title>
    <link href="https://blog.980712.xyz/posts/50044.html"/>
    <id>https://blog.980712.xyz/posts/50044.html</id>
    <published>2022-12-05T07:17:20.000Z</published>
    <updated>2023-02-22T11:55:37.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="准备工作：安装termux-安装adb工具"><a href="#准备工作：安装termux-安装adb工具" class="headerlink" title="准备工作：安装termux&amp;&amp;安装adb工具"></a>准备工作：安装termux&amp;&amp;安装adb工具</h2><h4 id="1-需要一部安卓手机，安装termux应用，可以根据国光大佬的教程安装"><a href="#1-需要一部安卓手机，安装termux应用，可以根据国光大佬的教程安装" class="headerlink" title="1. 需要一部安卓手机，安装termux应用，可以根据国光大佬的教程安装"></a>1. 需要一部安卓手机，安装termux应用，可以根据<a href="https://www.sqlsec.com/2018/05/termux.html">国光大佬的教程</a>安装</h4><h4 id="2-使用如下命令自动替换官方源为-TUNA-镜像源。pkg-update-卡住的话多按几次回车-不要傻乎乎的等"><a href="#2-使用如下命令自动替换官方源为-TUNA-镜像源。pkg-update-卡住的话多按几次回车-不要傻乎乎的等" class="headerlink" title="2. 使用如下命令自动替换官方源为 TUNA 镜像源。pkg update 卡住的话多按几次回车 不要傻乎乎的等"></a>2. 使用如下命令自动替换官方源为 TUNA 镜像源。<code>pkg update</code> 卡住的话多按几次回车 不要傻乎乎的等</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sed</span> <span class="token parameter variable">-i</span> <span class="token string">'s@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable main@'</span> <span class="token variable">$PREFIX</span>/etc/apt/sources.list<span class="token function">sed</span> <span class="token parameter variable">-i</span> <span class="token string">'s@^\(deb.*games stable\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/game-packages-24 games stable@'</span> <span class="token variable">$PREFIX</span>/etc/apt/sources.list.d/game.list<span class="token function">sed</span> <span class="token parameter variable">-i</span> <span class="token string">'s@^\(deb.*science stable\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/science-packages-24 science stable@'</span> <span class="token variable">$PREFIX</span>/etc/apt/sources.list.d/science.listpkg update<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h4 id="3-运行如下命令安装git等工具："><a href="#3-运行如下命令安装git等工具：" class="headerlink" title="3. 运行如下命令安装git等工具："></a>3. 运行如下命令安装git等工具：</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">pkg updatepkg <span class="token function">install</span> <span class="token function">vim</span> <span class="token function">curl</span> <span class="token function">wget</span> <span class="token function">git</span> tree <span class="token parameter variable">-y</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><h4 id="4-运行如下命令安装adb工具"><a href="#4-运行如下命令安装adb工具" class="headerlink" title="4. 运行如下命令安装adb工具"></a>4. 运行如下命令安装adb工具</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> clone https://github.com/rendiix/termux-adb-fastboot.git<span class="token builtin class-name">cd</span> termux-adb-fastboot<span class="token function">bash</span> install.sh<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h4 id="5-运行如下命令授权termux访问手机本地文件"><a href="#5-运行如下命令授权termux访问手机本地文件" class="headerlink" title="5. 运行如下命令授权termux访问手机本地文件"></a>5. 运行如下命令授权termux访问手机本地文件</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">termux-setup-storage<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>至此准备工作已经完成，接下来就可以通过adb工具连接电视进行安装。</p><h2 id="打开adb调试，连接电视进行安装"><a href="#打开adb调试，连接电视进行安装" class="headerlink" title="打开adb调试，连接电视进行安装"></a>打开adb调试，连接电视进行安装</h2><h4 id="1-开启电视adb调试，查看网络信息"><a href="#1-开启电视adb调试，查看网络信息" class="headerlink" title="1. 开启电视adb调试，查看网络信息"></a>1. 开启电视adb调试，查看网络信息</h4><pre class="line-numbers language-none"><code class="language-none">//开启adb调试设置 -&gt;系统信息 -&gt; 依次按上下左右键 -&gt; 确认键 -&gt; 开启adb调试//查看ip设置 -&gt;网络 -&gt; 无线网络-&gt; 网络详情<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h4 id="2-利用adb连接电视，设置允许安装第三方app"><a href="#2-利用adb连接电视，设置允许安装第三方app" class="headerlink" title="2. 利用adb连接电视，设置允许安装第三方app"></a>2. 利用adb连接电视，设置允许安装第三方app</h4><blockquote><p>首先电视和电脑连接在同一个网络<br>电视选择允许访问<br>电脑终端输入以下命令</p></blockquote><ol><li>adb连接电视<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">adb connect ip（改成自己电视ip）连接成功后输入下面命令<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li><li>允许如下命令（只在首次安装前运行，后面直接执行安装命令就行）<pre class="line-numbers language-none"><code class="language-none">adb shell settings put global verifier_verify_adb_installs 0adb shell settings put global package_verifier_enable 0<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></li><li>运行安装命令<pre class="line-numbers language-none"><code class="language-none">adb install ./base.apk #（比如adb install ./base.apk）自己文件在哪里就改成自己的文件路径显示Success就成功了<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;准备工作：安装termux-安装adb工具&quot;&gt;&lt;a href=&quot;#准备工作：安装termux-安装adb工具&quot; class=&quot;headerlink&quot; title=&quot;准备工作：安装termux&amp;amp;&amp;amp;安装adb工具&quot;&gt;&lt;/a&gt;准备工作：安装termux&amp;</summary>
      
    
    
    
    <category term="硬件" scheme="https://blog.980712.xyz/categories/%E7%A1%AC%E4%BB%B6/"/>
    
    
  </entry>
  
</feed>
