<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>auv1107 (sintone)</title>
    <link>https://beta.w2solo.com/auv1107</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>SecureClipX —— 一款 100% 免费且（即将）开源的安全「系统剪贴板」替代方案</title>
      <description>&lt;p&gt;大家好，我是 CleanClip 这款 macOS 剪贴板管理应用的作者。请稍安勿躁，我提到 CleanClip 并非是在此推广这款应用，而是要介绍开发 CleanClip 过程中产生的一款衍生产品：&lt;/p&gt;

&lt;p&gt;一款全新的、完全免费且开源的系统剪贴板替代品——SecureClipX，它提供了一种&lt;strong&gt;新的方式代替系统的复制粘贴&lt;/strong&gt;，旨在防止通过系统剪贴板泄露数据。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;为何开发 SecureClipX?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;在开发 CleanClip 的过程中,我收到了许多关于"&lt;strong&gt;用户隐私&lt;/strong&gt;"的反馈,以及诸如"&lt;strong&gt;为何我应该相信你不会秘密上传数据&lt;/strong&gt;"之类的疑虑。因此,我一直在思考如何在保护用户数据的同时,也让用户放心。&lt;/p&gt;

&lt;p&gt;现在,我有了一个初步的解决方案:发布一款开源软件，防止系统剪贴板被滥用。开源可以让用户放心,而精心设计的产品逻辑,则确保了数据安全。&lt;/p&gt;

&lt;p&gt;我希望 SecureClipX 能够解决所有那些对系统剪贴板安全性如此重视的用户的后顾之忧。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;谁会需要这款软件？&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;对个人信息敏感的人&lt;/li&gt;
&lt;li&gt;使用闭源剪贴板管理器的人&lt;/li&gt;
&lt;li&gt;经常进行加密货币交易的人（剪贴板地址替换攻击）&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;SecureClipX 的功能:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SecureClipX 只做这三件事:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;监视系统剪贴板，一旦有新内容，就将其保存并清空系统剪贴板。&lt;/li&gt;
&lt;li&gt;当用户按下⌘V 进行粘贴时，从安全区域粘贴已保存的内容。&lt;/li&gt;
&lt;li&gt;(可选) 自动对用户复制的数据进行去敏操作。&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;如果你喜欢这款应用:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;目前，SecureClipX &lt;strong&gt;尚未完成开发&lt;/strong&gt;，不过网站上已开放了等候名单。&lt;/p&gt;

&lt;p&gt;如果你对 SecureClipX 感兴趣，我诚挚地邀请你 &lt;strong&gt;&lt;a href="https://secureclipx.cleanclip.cc" rel="nofollow" target="_blank" title=""&gt;加入等候名单 (需回答三个问题)&lt;/a&gt;&lt;/strong&gt; ，或在网站上加入 Discord 服务器，与我一起讨论。&lt;/p&gt;

&lt;p&gt;所有的讨论都将有助于使这款应用变得更加完善。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;访问 &lt;a href="https://secureclipx.cleanclip.cc" rel="nofollow" target="_blank" title=""&gt;https://secureclipx.cleanclip.cc&lt;/a&gt; 查看更多。&lt;/strong&gt;&lt;/p&gt;</description>
      <author>auv1107</author>
      <pubDate>Thu, 11 Apr 2024 10:10:58 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/4543</link>
      <guid>https://beta.w2solo.com/topics/4543</guid>
    </item>
    <item>
      <title>分享下我怎么用 Cloudflare Worker 一个文件为我的出海产品支持购买力平价能力的</title>
      <description>&lt;p&gt;&lt;img src="https://cleanclip.cc/images/headers/ppp.png" width="80%" style="max-width:unset;" class="mt-8"&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;由于各个国家、地区购买力不一，出海产品需要为不同购买力的地区设定不同的价格。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;实现购买力平价&lt;strong&gt;需要两个数据：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;用户的位置数据&lt;/li&gt;
&lt;li&gt;一份各国家的购买力水平清单&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;逻辑就很简单了：&lt;/strong&gt;
位置数据 -&amp;gt; 购买力水平 -&amp;gt; 匹配相应价格信息并应用&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;那么这两个数据怎么获取呢？&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="位置数据"&gt;位置数据&lt;/h2&gt;
&lt;p&gt;Cloudflare Worker 的 &lt;strong&gt;request 参数&lt;/strong&gt;带了非常详细的&lt;strong&gt;位置数据&lt;/strong&gt;，这让我们不需要再使用第三方服务就能方便地获取位置：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://p.ipic.vip/4m3ptz.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;它包括了经纬度、地区代码等，我们的颗粒度精确到国家，这里用&lt;strong&gt;国家代码 country 字段&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="购买力水平数据"&gt;购买力水平数据&lt;/h2&gt;
&lt;p&gt;购买力水平等级可以在这个 gist 下载：&lt;a href="https://gist.github.com/auv1107/999c97a62338833f93b6c3cc5ae08ce8" rel="nofollow" target="_blank" title=""&gt;各国家购买力水平清单&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="逻辑和实现代码"&gt;逻辑和实现代码&lt;/h2&gt;
&lt;p&gt;大致逻辑是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;从 Worker 的 request 参数&lt;strong&gt;获取国家代码&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;使用国家代码从购买能力列表&lt;strong&gt;获取购买力水平&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;根据水平匹配相应的&lt;strong&gt;折扣信息并应用&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;我在 &lt;a href="https://cleanclip.cc" rel="nofollow" target="_blank" title=""&gt;CleanClip&lt;/a&gt;(Mac 上的剪贴板工具) 中简单起见，直接为不同国家应用不同的折扣。
LemonSqueezy 可以这样直接应用折扣码：PRODUCT_URL + "?checkout%5Bdiscount_code%5D=" + discountCode&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;一些细节：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;折扣信息保存在环境变量里，方便随时修改&lt;/li&gt;
&lt;li&gt;Access-Control-Max-Age 缓存设为 0，可方便随时改动，即时生效。（不设置会导致上次结果保留过久，实践大概是 3、4 天左右才生效，设为 0 即时生效）&lt;/li&gt;
&lt;li&gt;可以将这个 worker 连接到其它 worker 下，价格信息在这里统一维护，方便多页面、业务使用&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ppp&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./pppdata.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// map 一下购买力数据的列表，方便搜索&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;flatppp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ppp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;category&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;countries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;countryInfo&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;range&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;range&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;countryInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;country&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;countryInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;countryName&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}))&lt;/span&gt;

&lt;span class="c1"&gt;// 在购买力水平列表中找到对应国家&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;findCountry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;flatppp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deal&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;deal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;countryCode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 根据购买力水平，在环境变量里找到配置的折扣信息&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;range&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;range&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.0-0.1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level0_1&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level0_1_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.1-0.2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level1_2&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level1_2_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.2-0.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level2_3&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level2_3_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.3-0.4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level3_4&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level3_4_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.4-0.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level4_5&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level4_5_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.5-0.6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level5_6&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level5_6_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.6-0.7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level6_7&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level6_7_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.7-0.8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level7_8&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level7_8_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.8-0.9&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level8_9&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level8_9_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.9-1.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level9_10&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level9_10_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0-1.1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level10_11&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level10_11_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.1-1.2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level11_12&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level11_12_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.2-1.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level12_13&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level12_13_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.3-1.4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level13_14&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;level13_14_discount&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 合并国家购买力信息+折扣信息&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;mergeDiscountResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;countryPPP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;range&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;countryPPP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;range&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;countryPPP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;countryPPP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;discountCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;discount&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 构造 response&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;responseFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access-Control-Allow-Origin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access-Control-Allow-Headers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access-Control-Allow-Methods&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET, OPTIONS, POST, PUT, DELETE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access-Control-Max-Age&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ✨ 核心代码&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 1. 获取国家编码&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;countryCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;country&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. 在购买力列表中找到该国家&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;countryPPP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;findCountry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. 通过该国家购买力获取对应优惠信息&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getDiscount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;countryPPP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;range&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;countryPPP&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// 构造结果&lt;/span&gt;
      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mergeDiscountResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;countryPPP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;discount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="c1"&gt;// 4. 可以直接返回结果供其它服务调用&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;responseFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;responseFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// 5. 或者直接 301 重定向到指定优惠链接&lt;/span&gt;
    &lt;span class="c1"&gt;// let url = env.TARGET_DOMAIN&lt;/span&gt;
    &lt;span class="c1"&gt;// if (discountCode !== undefined &amp;amp;&amp;amp; discountCode.length &amp;gt; 0) {&lt;/span&gt;
    &lt;span class="c1"&gt;//   url = env.TARGET_DOMAIN + "?checkout%5Bdiscount_code%5D=" + discountCode&lt;/span&gt;
    &lt;span class="c1"&gt;// }&lt;/span&gt;
    &lt;span class="c1"&gt;// var response = Response.redirect(url, 301);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;原文地址：&lt;a href="https://cleanclip.cc/zh/developer/cloudflare-worker-implements-purchasing-power-parity/" rel="nofollow" target="_blank"&gt;https://cleanclip.cc/zh/developer/cloudflare-worker-implements-purchasing-power-parity/&lt;/a&gt;&lt;/p&gt;</description>
      <author>auv1107</author>
      <pubDate>Thu, 08 Feb 2024 14:13:17 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/4417</link>
      <guid>https://beta.w2solo.com/topics/4417</guid>
    </item>
    <item>
      <title>分享一下 CleanClip 的快捷键设计</title>
      <description>&lt;p&gt;展示一下 CleanClip 的快捷键设计。&lt;/p&gt;

&lt;p&gt;快捷键设计原则遵循：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1️⃣ 非必要不增加新的快捷键&lt;/li&gt;
&lt;li&gt;2️⃣ 尽最大可能使按键最少&lt;/li&gt;
&lt;li&gt;3️⃣ 尽量保持既有的快捷键习惯&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;图中的快捷键中：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;同一个快捷键 ⌘; 单击/双击展示不同选项卡，遵循原则 1。&lt;/li&gt;
&lt;li&gt;0-9 选择选项而不是 ⌘+0-9，遵循原则 2。&lt;/li&gt;
&lt;li&gt;␣ 预览，遵循原则 3。&lt;/li&gt;
&lt;li&gt;a-z 直接搜索遵循原则 1/2。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/auv1107/c19a48db-4e09-4abe-9322-5565f2064f7e.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>auv1107</author>
      <pubDate>Mon, 11 Dec 2023 15:31:33 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/4300</link>
      <guid>https://beta.w2solo.com/topics/4300</guid>
    </item>
    <item>
      <title>🎁「CleanClip 优惠来袭」： 专为 Mac 打造的沉浸式剪贴板管理工具 CleanClip🔧 三期发布，支持了图片、文件等多种格式，支持预览功能🎉</title>
      <description>&lt;p&gt;&lt;img src="https://p.ipic.vip/x5zqgu.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;📋 &lt;strong&gt;CleanClip&lt;/strong&gt;：专为 Mac 打造的沉浸式剪贴板管理工具🔧&lt;/p&gt;

&lt;p&gt;CleanClip 三期新增了图片、文件等多种格式的支持，支持对历史记录进行更详细的预览🎉&lt;/p&gt;

&lt;p&gt;三期功能&lt;strong&gt;「历史记录快捷弹窗、无限制条数查看搜索、全格式支持」&lt;/strong&gt;完成后，CleanClip 已经具备了剪贴板 App 的基本素质。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;官网：&lt;/strong&gt;&lt;a href="https://clip.macaify.com/zh/" rel="nofollow" target="_blank" title=""&gt;CleanClip&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;预览视频：&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://clip.macaify.com/videos/preview.mp4" rel="nofollow" target="_blank"&gt;https://clip.macaify.com/videos/preview.mp4&lt;/a&gt; 图片文件预览&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://clip.macaify.com/videos/search-real.mp4" rel="nofollow" target="_blank"&gt;https://clip.macaify.com/videos/search-real.mp4&lt;/a&gt; 记录搜索&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roadmap：&lt;/strong&gt;&lt;a href="https://clip.macaify.com/zh/docs/roadmap.html" rel="nofollow" target="_blank"&gt;https://clip.macaify.com/zh/docs/roadmap.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;更新日志：&lt;/strong&gt;&lt;a href="https://clip.macaify.com/zh/docs/changelog.html" rel="nofollow" target="_blank"&gt;https://clip.macaify.com/zh/docs/changelog.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💕 &lt;strong&gt;试用规则&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;可以无限期♾️试用全部功能，你可以先下载试用足够长时间，再决定是否购买。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎁 限时开放第三期早鸟福利&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;28 元/终身&lt;/li&gt;
&lt;li&gt;获取：官网右上角点击「早鸟优惠🎁」&lt;/li&gt;
&lt;li&gt;时间：2023.9.9 - 2023.9.12&lt;/li&gt;
&lt;li&gt;参考价格：Paste 98/年，uPaste 68/终身，PasteNow 50/终身，PasteBot 88/终身，iPaste 58/终身&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>auv1107</author>
      <pubDate>Sat, 09 Sep 2023 16:49:46 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/4124</link>
      <guid>https://beta.w2solo.com/topics/4124</guid>
    </item>
    <item>
      <title>如果有这么一款剪贴板应用，你会为它买单吗 &lt;截止 8.11 发帖：20 人团已成，后续入群仍可获取早鸟价格买断链接&gt;</title>
      <description>&lt;p&gt;作为一个曾经忠实的 ubuntu 系统用户，我对于 ubuntu 的一个小系统功能非常喜爱——&lt;strong&gt;历史剪贴板&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;这个功能非常简单：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 按下 &lt;strong&gt;「 ctrl + ;」&lt;/strong&gt;，桌面中间会显示五条复制历史，标号 1~5&lt;/li&gt;
&lt;li&gt; 按下数字，自动粘贴&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;后来转用 Mac ，没有了这个功能很不习惯，但是尝试了很多 App 但是一直没有发现合适的替代品。&lt;/p&gt;

&lt;p&gt;iPaste 、Maccy 、PasteNow 等等等等，它们做的很好，可是用着全都不太习惯。&lt;/p&gt;

&lt;p&gt;我的要求也不高，就两点：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;界面精简。&lt;/strong&gt;历史记录 UI 要简洁，不要有多余的东西分散注意&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;操作简便。&lt;/strong&gt;不要超过 2 步：「 &lt;strong&gt;⌘ + ;&lt;/strong&gt; 」显示历史/点击数字自动粘贴&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;如果还有锦上添花的需求，那就是&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;沉浸感。&lt;/strong&gt;我希望它的出现不要打破原有工作的沉浸感。&lt;/p&gt;

&lt;p&gt;这意味着 UI 需要尽可能融入任意页面，对它的要求包括但不限于：不要弹出很大的窗口/不要离开我的工作页面/不要有太强的阴影。&lt;/p&gt;

&lt;p&gt;我希望它看起来就像是：「嵌入在每个页面里」。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;使用更少的按键&lt;/strong&gt;。拜托只用 1 来选择第一条记录并自动粘贴而不是 &lt;strong&gt;⌘ + 1&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;只保留或可选择只保留文字记录。&lt;/strong&gt;各种文件图片的粘贴记录我真的不需要，它们对我来说是负体验。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="市面上部份主流 App 体验"&gt;市面上部份主流 App 体验&lt;/h2&gt;&lt;h3 id="iPaste"&gt;iPaste&lt;/h3&gt;
&lt;p&gt;iPaste 对历史记录做了分级：常驻的、活跃的、历史的。&lt;/p&gt;

&lt;p&gt;对于一些常用内容比如邮箱、电话之类可以固定🧷到常驻部分。&lt;/p&gt;

&lt;p&gt;对于最近使用的五条记录会显示在列表顶部。&lt;/p&gt;

&lt;p&gt;对于更多的可以用鼠标点击「更多历史」查看。&lt;/p&gt;

&lt;p&gt;这是非常经典的分类方法，特别好。&lt;/p&gt;

&lt;p&gt;不过它对我来说两点基础需求都没满足。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 多余内容太多，图片、文件也会显示在列表。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;无法自动粘贴，操作需要三步：&lt;/p&gt;

&lt;p&gt;1.  快捷键显示历史记录&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 按数字选中某条记录（此时不会自动粘贴，还需要第三步&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;⌘ + V&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="https://p.ipic.vip/nr4hgr.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="uPaste"&gt;uPaste&lt;/h3&gt;
&lt;p&gt;界面很干净，可以自动粘贴。基础需求满足✅ hin 不错～&lt;/p&gt;

&lt;p&gt;另外，它对于我的高级需求「沉浸感」完成的不错，（它去掉了令人讨厌的阴影 omg ！它的设计师和我在此处应该击个掌✋）（吹毛求疵的话，它对我来说太大了。sad 😣。）&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;它是我的备选之一。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;然鹅🦢，如果只是这样我也不会发这个帖子。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 它的缺点是侧边栏只能暂时隐藏，无法永久关闭（它或许对很多人有用，但我并不需要它）。&lt;/li&gt;
&lt;li&gt; Esc 会调起一个窗口，如果你习惯用 &lt;strong&gt;⌘ + J&lt;/strong&gt; 后用 Esc 关闭窗口那你会感受到惊喜🐛。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="https://p.ipic.vip/cvmzyv.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="Paste Now"&gt;Paste Now&lt;/h3&gt;
&lt;p&gt;Paste Now 按下快捷键后，会展开菜单栏。我可以上下键移动，等选中后按下 Enter 自动粘贴。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 令人惊喜的是 Paste Now 支持 vim 的 hjkl 上下左右切换选项。这样的好处是我可以保持双手食指停留在定位键 F/J 附近，不需要移动手腕有过多移动即可完成操作。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Paste Now 的交互和 UI 相当不错，我可以 &lt;strong&gt;「⌘ + ‘」&lt;/strong&gt; 展开菜单，然后只松开 &lt;strong&gt;‘&lt;/strong&gt; 键，再按下数字键就能自动粘贴。&lt;/p&gt;

&lt;p&gt;对我来说不够完美的地方在于，有的时候展开的&lt;strong&gt;选项距离&lt;/strong&gt;我&lt;strong&gt;视线中心太远&lt;/strong&gt;。有时候我在屏幕中底部编辑内容，按下快捷键后视线不得不转移到顶部。&lt;/p&gt;

&lt;p&gt;另外它的菜单在我的一个屏幕上占据了 80% 的高度，这迫使我的眼睛👀不得不从屏幕🖥顶部移动到底部。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://p.ipic.vip/yvd0ef.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="iCopy"&gt;iCopy&lt;/h3&gt;
&lt;p&gt;iCopy 主界面非常漂亮，非常符合中国人的审美。&lt;/p&gt;

&lt;p&gt;所以显而易见地，它的历史记录界面对我而言有点过于花哨了。&lt;/p&gt;

&lt;p&gt;窗口过大，次要部分配色过于鲜艳抢夺视野焦点。&lt;/p&gt;

&lt;p&gt;主内容区布局咩有层次，甚至有非常明显的失衡。&lt;/p&gt;

&lt;p&gt;鼠标 hover 前后整体对比度差异过大。&lt;/p&gt;

&lt;p&gt;sry 槽点有点多。看起来似乎是开发者在主界面设计投入了太多精力，到了真正体现体验感的快捷界面，心力交瘁开始摆烂了？&lt;/p&gt;

&lt;p&gt;&lt;img src="https://p.ipic.vip/83uj04.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="适合我的设计"&gt;适合我的设计&lt;/h2&gt;
&lt;p&gt;从上面看，其实我需要的能力「两步操作」大部分 App 都能做到，但是 UI 上的需求却几乎没有达到。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 我并不是说它们不够好，它们非常优秀，只是不适合我。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;适合我&lt;strong&gt;的设计是什么样子？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;上面也提到了一点：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;沉浸感&lt;/strong&gt;。没有跳出工作页面的不适感。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;另外很重要但除了 uPaste 都没有做的很好的：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;易辨识&lt;/strong&gt;。我希望弹出菜单后能更快速地找到具体的记录📝。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;💡 你可以快速把这篇文章从头划到尾，途中扫一眼每张图片中的文字，你就会发现这几个 App 的辨识度的差异。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;uPaste 很容易一眼看到所有的选项，并且很清晰。&lt;/p&gt;

&lt;p&gt;Paste Now 和 iPaste 也还行，不过文字和背景的对比度略低，核心内容外的元素略多，会抢夺视野。&lt;/p&gt;

&lt;p&gt;iCopy 就差了点意思，元素纷杂，重心不清，最不能忍的是两个同级元素竟然还需要眼睛👀在日、夜间模式间切换。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://p.ipic.vip/e4gm6s.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="我会把它设计成这样："&gt;我会把它设计成这样：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt; 去掉大窗口、窗口边缘的大阴影、去掉整体背景色，让其看起来像是几行文字贴在页面里&lt;/li&gt;
&lt;li&gt; 使用高对比度的文字和背景，使其易识别&lt;/li&gt;
&lt;li&gt; 排列紧密，一眼纵观所有选项&lt;/li&gt;
&lt;li&gt; 不展示历史记录外的任何内容&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;它看起来大概是这样子：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://p.ipic.vip/mqywzg.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;也可能是这样：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://p.ipic.vip/929oyy.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;甚至会是这样子：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://p.ipic.vip/1z393b.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;整体的感觉大概如上面这样，配色、布局还会再去请教专业设计师做专业的调整。&lt;/p&gt;
&lt;h2 id="如果有这么一款剪贴板应用，你会为它买单吗？"&gt;如果有这么一款剪贴板应用，你会为它买单吗？&lt;/h2&gt;
&lt;p&gt;事实上，这是非常极致的效率需求，大部分人并不需要如此。&lt;/p&gt;

&lt;p&gt;不过如果有人跟我一样肯为极致的效率买单，愿意付费来使用这款应用以提高自己的效率。我非常愿意找专业的设计师完善它，然后实现它。&lt;/p&gt;
&lt;h3 id="计划"&gt;计划&lt;/h3&gt;
&lt;p&gt;作为开发动力以及输出质量的保证，App 不会以免费方式发布。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 早鸟价 12 元买断，包含第一版所有功能及后续两年更新内容。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;扫码进群，满 20 人付费开始开发。群里会日常更新开发进展，开发第 7 天交货第一版本。（另外也可以关注 X 账号，同样会更新进展情况 &lt;a href="https://twitter.com/s1ntone" rel="nofollow" target="_blank" title=""&gt;https://twitter.com/s1ntone&lt;/a&gt; ）&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第一版本&lt;/strong&gt;你将得到：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;「⌘ + ;」&lt;/strong&gt; →「数字键」两步操作查看并自动粘贴历史记录，最简洁的快捷键操作&lt;/li&gt;
&lt;li&gt; 界面简洁、沉浸式文字编辑，不会打断思考的 UI UX 设计&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="https://img.gokoding.com/sintone/qrcode/clipboard" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="后续版本"&gt;后续版本&lt;/h3&gt;
&lt;p&gt;会会根据用户反馈决定，可能包含：&lt;/p&gt;

&lt;p&gt;技术向：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; iCloud 同步&lt;/li&gt;
&lt;li&gt; 持久化更多历史记录&lt;/li&gt;
&lt;li&gt; 自然语言搜索&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;UI 向：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 主题定制&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="最后"&gt;最后&lt;/h2&gt;
&lt;p&gt;有些人或许会质疑，仅仅是剪贴板的历史记录，是否值得我们花费过多精力去关注细节？&lt;/p&gt;

&lt;p&gt;复制粘贴是文字编辑过程中非常高频的操作，每天使用 &lt;strong&gt;⌘ + CV&lt;/strong&gt; 的次数可达数百到数千次。使用历史记录的次数也可以达到数十次。这意味着剪贴板在我们的日常工作中扮演着重要的角色。&lt;/p&gt;

&lt;p&gt;此外，文字编辑过程中的心流状态对于保持高效和创造力至关重要。通过保持工作区的连续性，我们可以更好地集中注意力，避免中断和分散注意力的因素。这有助于我们保持专注并提高工作效率。&lt;/p&gt;

&lt;p&gt;因此，至少对于我来说，它是必须的。&lt;/p&gt;

&lt;p&gt;只是出于 roi 考虑，我目前不会只因为自己的需求开启一个项目。除非有另外 20 个效率极客们加入我。&lt;/p&gt;
&lt;h2 id="进展更新"&gt;进展更新&lt;/h2&gt;
&lt;p&gt;2023.8.11
目前 20 人已集齐！正在联系设计师。
后续仍可入群，获取早鸟价格买断链接。&lt;/p&gt;</description>
      <author>auv1107</author>
      <pubDate>Fri, 11 Aug 2023 17:21:10 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/4065</link>
      <guid>https://beta.w2solo.com/topics/4065</guid>
    </item>
    <item>
      <title>Macaify - 用这个 App 在 Mac 电脑的任何地方无缝使用 ChatGPT。并且不止于 ChatGPT</title>
      <description>&lt;h2 id="Macaify - Make your Mac-AI-fy"&gt;Macaify - Make your Mac-AI-fy&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://p.ipic.vip/rgpey0.webp" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;软件名字叫 &lt;strong&gt;Macaify&lt;/strong&gt;，拆开 Mac-AI-fy 意思是「把你的 Mac AI 化」。&lt;/p&gt;

&lt;p&gt;这是一个专注于各类 AI 能力在 Mac 电脑上的使用体验的 App。&lt;/p&gt;

&lt;p&gt;目前已接入 ChatGPT，可以在你的&lt;strong&gt;任意 App&lt;/strong&gt; 中无缝使用 &lt;strong&gt;ChatGPT&lt;/strong&gt; 的能力。&lt;/p&gt;
&lt;h2 id="如何在任意 App 中无缝使用 ChatGPT"&gt;如何在&lt;strong&gt;任意 App&lt;/strong&gt; 中无缝使用 &lt;strong&gt;ChatGPT&lt;/strong&gt;
&lt;/h2&gt;&lt;h3 id="1. 预设好需要使用 ChatGPT 的场景 🤖️，设定快捷键🔑"&gt;1. 预设好需要使用 ChatGPT 的场景 🤖️，设定快捷键🔑&lt;/h3&gt;
&lt;p&gt;比如中英翻译、头脑风暴、变量名生成、邮件回复模版、资料查询、文案优化等。&lt;/p&gt;

&lt;p&gt;你需要在 &lt;strong&gt;Macaify&lt;/strong&gt; 里新建一个机器人🤖️，输入他的 Prompt ✍️，设定一个快捷键🔑。&lt;/p&gt;

&lt;p&gt;预设的机器人：
&lt;img src="https://p.ipic.vip/wpsf1p.png" title="" alt=""&gt;
添加新机器人：
&lt;img src="https://p.ipic.vip/ixmeot.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="2. 在你工作的 App 里选择要处理的文字，按下快捷键🔑，然后就铛铛铛～得到答案"&gt;2. 在你工作的 App 里选择要处理的文字，按下快捷键🔑，然后就铛铛铛～得到答案&lt;/h3&gt;
&lt;p&gt;你无需离开你的工作 App，也不会调起其他界面，只需要按下一个快捷键，ChatGPT 的处理结果会自动流式地输出到你的工作 App 中。&lt;/p&gt;

&lt;p&gt;从体感上就是，像是你的工作 App 里集成了 ChatGPT 一样。&lt;/p&gt;

&lt;p&gt;比如&lt;strong&gt;中英翻译场景&lt;/strong&gt;：&lt;/p&gt;

&lt;p&gt;我发推特时要把语言翻译成英文，我在发推输入框里用中文输入好要发的内容，command+A 选中文字✅，然后按下你预设好的快捷键🔑。 &lt;strong&gt;Macaify&lt;/strong&gt; 会在后台自动用翻译成英文的内容替换成选中的文字。当然，你也可以只选中部分文字。&lt;/p&gt;

&lt;p&gt;比如&lt;strong&gt;写 PPT 或文档时需要优化文案&lt;/strong&gt;：&lt;/p&gt;

&lt;p&gt;选择要优化的文案文字📒，然后按下你为优化文案预设的快捷键🔑。&lt;strong&gt;Macaify&lt;/strong&gt; 会自动用优化好的文案代替你选中的文字。&lt;/p&gt;

&lt;p&gt;看看操作视频：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.macaify.com/videos/feature-any.mp4" rel="nofollow" target="_blank"&gt;https://www.macaify.com/videos/feature-any.mp4&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="如果你只是想聊天"&gt;如果你只是想聊天&lt;/h2&gt;
&lt;p&gt;当然可以～&lt;/p&gt;

&lt;p&gt;点进预设的机器人，就可以直接聊天了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://p.ipic.vip/nec6d8.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="如果你不知道怎么写 机器人🤖️ Prompt"&gt;如果你不知道怎么写 机器人🤖️ Prompt&lt;/h2&gt;
&lt;p&gt;机器人🤖️ 广场有几千个预制的机器人可以使用&lt;/p&gt;

&lt;p&gt;&lt;img src="https://p.ipic.vip/filz4f.png" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="正在做的功能"&gt;正在做的功能&lt;/h2&gt;
&lt;p&gt;这里不过多画饼，想做的方向很多，只稍微提一下下一小步要做的。&lt;/p&gt;

&lt;p&gt;下一步仍然是内容生产相关：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;自然语言图片搜索🔍、图表生成&lt;/strong&gt;类能力，让你做到足不出 App，得到想要的图片和图表。&lt;/p&gt;

&lt;p&gt;下一步优先做这个是考虑到我们在电脑 💻 上的最常用的场景仍然是在广泛意义的编辑器中。&lt;/p&gt;

&lt;p&gt;各类文档也好、PPT 也好、V2ex 发帖也好，离不开图片和文字的处理能力。&lt;/p&gt;

&lt;p&gt;当文字通过 ChatGPT 解决后，结下来的选择「图片」也就变得顺其自然。&lt;/p&gt;
&lt;h3 id="自然语言图片搜索 🔍"&gt;自然语言图片搜索 🔍&lt;/h3&gt;
&lt;p&gt;不过和类似产品稍有不同的是，我选择的是「图片搜索🔍」而不是「生成」。主要原因是，「生成」的速度和质量不可控，多数人们尚未形成使用「生成」的图片进行工作的习惯。&lt;/p&gt;

&lt;p&gt;而「搜索」相当于优化了原来的工作步骤：&lt;/p&gt;

&lt;p&gt;「切换到浏览器」-&amp;gt;「使用关键词搜索」-&amp;gt;「筛选」-&amp;gt;「复制」-&amp;gt;「切换回工作去」-&amp;gt;「粘贴」，&lt;/p&gt;

&lt;p&gt;简化为：&lt;/p&gt;

&lt;p&gt;「用自然语言描述需求」-&amp;gt;「按下快捷键🔑」-&amp;gt;「筛选」-&amp;gt;「确认选择」&lt;/p&gt;

&lt;p&gt;相对传统步骤的优势：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;使用自然语言搜索，搜索结果更精准&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;减少了步骤，节省了时间&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;不离开原有 App，减少了注意力⚠️分散&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="图表📈生成"&gt;图表📈生成&lt;/h3&gt;
&lt;p&gt;仍然是做 PPT 写文档的场景中。&lt;/p&gt;

&lt;p&gt;工作中 battle 时听到很多的一句话是「拿数据说话」。&lt;/p&gt;

&lt;p&gt;而展示数据最好的方式就是图表📈。&lt;/p&gt;

&lt;p&gt;无论你是数据图表📈，还是先有代码的流程图，通过 AI 能力都能一键生成。&lt;/p&gt;

&lt;p&gt;不过很多人不知道如何使用，即便知道，现有流程也较为繁琐。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;拿生成流程图为例&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;我需要把逻辑代码拷贝到 ChatGPT 里，让它整理出流程图代码。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;然后再把流程图拿到某个不知名的工具🔧 里让他生成质量不确定的流程图。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;我希望这两步变成一步，然后想办法通过工程方法让它的出图变得质量较高、可用性较高。&lt;/p&gt;
&lt;h2 id="价格"&gt;价格&lt;/h2&gt;&lt;h3 id="免费 🆓"&gt;免费 🆓&lt;/h3&gt;
&lt;p&gt;铛铛铛铛～&lt;strong&gt;全部免费&lt;/strong&gt;！&lt;/p&gt;

&lt;p&gt;上面提到的功能和对它们的维护全部免费～&lt;/p&gt;
&lt;h3 id="收费计划"&gt;收费计划&lt;/h3&gt;
&lt;p&gt;当然，为了保证它的可持续发展，付费计划也在路上了。&lt;/p&gt;

&lt;p&gt;我们&lt;strong&gt;不会对当前的所有能力&lt;/strong&gt;收费，并且会提供更多免费功能。&lt;/p&gt;

&lt;p&gt;我们会对一些高级能力和技术支持收费。&lt;/p&gt;

&lt;p&gt;如果你&lt;strong&gt;对现有功能有任何问题&lt;/strong&gt;，欢迎👏留言或邮件📧我们。&lt;/p&gt;

&lt;p&gt;如果你期待&lt;strong&gt;更多的 AI 能力&lt;/strong&gt;，欢迎👏留言或邮件📧我们。&lt;/p&gt;

&lt;p&gt;如果你也是个&lt;strong&gt;有类似想法&lt;/strong&gt;的开发者，欢迎👏留言或邮件📧我们（搞基？）。&lt;/p&gt;
&lt;h2 id="官网"&gt;官网&lt;/h2&gt;
&lt;p&gt;感谢你看到这里，我们的官网是：&lt;a href="https://Macaify.com" rel="nofollow" target="_blank"&gt;https://Macaify.com&lt;/a&gt;
欢迎来访。&lt;/p&gt;</description>
      <author>auv1107</author>
      <pubDate>Tue, 18 Jul 2023 09:44:42 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/3997</link>
      <guid>https://beta.w2solo.com/topics/3997</guid>
    </item>
  </channel>
</rss>
