<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
  <title>红枫吟 - 作品</title>
    <subtitle>风落花语风落天，花落风雨花落田.</subtitle>
  <link href="https://honmaple.me/posts/project/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="https://honmaple.me/posts/project/"/>
  <generator uri="https://github.com/honmaple/snow">Snow</generator>
    <updated>Wed, 08 Jul 2026 11:27:13 +0000</updated>
  <id>https://honmaple.me</id>
    <entry xml:lang="zh">
      <title>为内容创作者和开发者打造的轻量级静态站点生成器Snow</title>
      <link href="https://honmaple.me/posts/2026/06/snow-intro/" rel="alternate"></link>
      <published>Tue, 16 Jun 2026 14:00:00 +0000</published>
      <updated>Wed, 08 Jul 2026 11:27:13 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2026/06/snow-intro/" type="text/html"/>
      <id>https://honmaple.me/posts/2026/06/snow-intro/</id>
      <summary type="html">&lt;p&gt;如果你想搭建一个博客、技术文档站、项目主页，或者一个可以长期维护的内容网站，你可能已经尝试过许多静态站点生成器。它们功能强大，但有时也意味着复杂的依赖、繁琐的配置和不够直观的扩展方式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Snow&lt;/strong&gt; 提供了另一种选择：一个用 Go 编写的、单二进制分发的静态站点生成器。它足够轻量，也足够灵活，适合从个人博客到多语言文档站的多种场景。&lt;/p&gt;
&lt;h2 id=&quot;heading-1&quot;&gt;开箱即用，快速开始&lt;/h2&gt;
&lt;p&gt;Snow 的使用方式非常直接。你可以通过 Homebrew 安装：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;brew install honmaple/tap/snow
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;也可以直接从源码安装：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;go install github.com...&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;</summary>
      <content type="html">&lt;p&gt;如果你想搭建一个博客、技术文档站、项目主页，或者一个可以长期维护的内容网站，你可能已经尝试过许多静态站点生成器。它们功能强大，但有时也意味着复杂的依赖、繁琐的配置和不够直观的扩展方式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Snow&lt;/strong&gt; 提供了另一种选择：一个用 Go 编写的、单二进制分发的静态站点生成器。它足够轻量，也足够灵活，适合从个人博客到多语言文档站的多种场景。&lt;/p&gt;
&lt;h2 id=&quot;heading-1&quot;&gt;开箱即用，快速开始&lt;/h2&gt;
&lt;p&gt;Snow 的使用方式非常直接。你可以通过 Homebrew 安装：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;brew install honmaple/tap/snow
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;也可以直接从源码安装：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;go install github.com/honmaple/snow@latest
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;创建新站点只需要一条命令：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;snow init myblog
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;随后进入目录，启动本地预览：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;snow server --autoload
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;--autoload&lt;/code&gt; 会监听内容、模板和静态文件变化，自动重新构建并刷新浏览器。写文章、调模板、看效果，整个流程非常顺滑。&lt;/p&gt;
&lt;p&gt;生产环境构建同样简单：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;snow build --mode publish --clean
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Snow 支持通过 &lt;code&gt;mode&lt;/code&gt; 管理不同环境配置，例如本地开发使用 &lt;code&gt;127.0.0.1&lt;/code&gt;，发布时自动切换为正式域名。&lt;/p&gt;
&lt;h2 id=&quot;heading-2&quot;&gt;支持 Markdown、Org-mode 和 HTML&lt;/h2&gt;
&lt;p&gt;Snow 不只支持常见的 Markdown，也内置支持 Org-mode 和 HTML 内容文件。对于习惯使用 Emacs/Org-mode 管理知识库的用户来说，这一点非常友好。&lt;/p&gt;
&lt;p&gt;你可以在 &lt;code&gt;content/&lt;/code&gt; 目录下自由组织内容：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;content/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;├── about.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;└── posts/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;    ├── hello.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;    └── bundle/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;        ├── index.md
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;7&lt;/span&gt;&lt;span&gt;        └── image.png
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Snow 支持 Page Bundle，文章和图片等资源可以放在同一个目录中，便于迁移、备份和维护。&lt;/p&gt;
&lt;h2 id=&quot;heading-3&quot;&gt;清晰的内容模型&lt;/h2&gt;
&lt;p&gt;Snow 的内容系统围绕三个核心概念构建：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Page&lt;/strong&gt;：单篇文章或页面&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Section&lt;/strong&gt;：栏目或目录，用来组织文章&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Taxonomy&lt;/strong&gt;：标签、分类、作者等归档系统&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过 FrontMatter，你可以轻松控制标题、日期、slug、草稿状态、自定义路径、模板、标签和分类：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;title&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;我的文章&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;date&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;2024-01-15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;tags&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;  - &lt;span style=&quot;color:#ae81ff&quot;&gt;go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;  - &lt;span style=&quot;color:#ae81ff&quot;&gt;web&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;categories&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;  - &lt;span style=&quot;color:#ae81ff&quot;&gt;Programming/Go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;draft&lt;/span&gt;: &lt;span style=&quot;color:#66d9ef&quot;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;对于博客、知识库、项目文档来说，这种模型既直观，也足够强大。&lt;/p&gt;
&lt;h2 id=&quot;heading-4&quot;&gt;多语言、分页、RSS，一应俱全&lt;/h2&gt;
&lt;p&gt;Snow 内置多语言能力，支持通过目录、文件后缀或 FrontMatter 识别语言。你可以为不同语言配置独立内容目录、翻译文件和站点参数。&lt;/p&gt;
&lt;p&gt;同时，Snow 支持 Section 和 Taxonomy 级别的分页，也支持 RSS、Atom、JSON 等自定义输出格式。无论你是在做个人博客、产品文档，还是需要生成机器可读的数据源，Snow 都能覆盖常见需求。&lt;/p&gt;
&lt;h2 id=&quot;heading-5&quot;&gt;灵活的模板系统&lt;/h2&gt;
&lt;p&gt;Snow 使用 Pongo2 模板引擎，语法接近 Django：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;{% for page in pages.OrderBy(&amp;#34;date desc&amp;#34;) %}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;a&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;{{ page.Path }}&amp;#34;&lt;/span&gt;&amp;gt;{{ page.Title }}&amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;a&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;{% endfor %}
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;模板中可以直接访问页面、栏目、分类、配置和多语言翻译函数。Snow 还提供了常用的列表操作能力，例如排序、分组、筛选、限制数量、上一篇/下一篇等。&lt;/p&gt;
&lt;p&gt;这意味着你可以很轻松地构建文章列表、归档页、标签页、相关推荐和自定义首页。&lt;/p&gt;
&lt;h2 id=&quot;heading-6&quot;&gt;主题可覆盖，站点可定制&lt;/h2&gt;
&lt;p&gt;Snow 支持主题系统。主题可以包含模板、静态资源和配置文件：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;themes/mytheme/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;├── theme.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;├── templates/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;├── static/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;└── i18n/
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;站点本地模板优先级高于主题模板，因此你可以先使用主题快速启动，再按需覆盖某个页面模板，而不必复制整个主题。&lt;/p&gt;
&lt;p&gt;这种设计既适合普通用户快速搭站，也适合开发者维护自己的主题体系。&lt;/p&gt;
&lt;h2 id=&quot;heading-7&quot;&gt;插件 Hook，让构建流程可扩展&lt;/h2&gt;
&lt;p&gt;Snow 内置 Hook 插件系统，可以在内容处理、模板执行、资源处理、写入输出等阶段插入自定义逻辑。&lt;/p&gt;
&lt;p&gt;目前内置插件包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;shortcode&lt;/code&gt;：在内容中嵌入可复用组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;encrypt&lt;/code&gt;：内容加密&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assets&lt;/code&gt;：静态资源处理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;minify&lt;/code&gt;：输出压缩&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rewrite&lt;/code&gt;：FrontMatter 重写&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filter&lt;/code&gt;：页面筛选&lt;/li&gt;
&lt;li&gt;&lt;code&gt;snakecase&lt;/code&gt;：模板上下文 snake_case 访问&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pelican&lt;/code&gt;：文档格式转换辅助&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;默认启用 &lt;code&gt;assets&lt;/code&gt;、&lt;code&gt;encrypt&lt;/code&gt; 和 &lt;code&gt;shortcode&lt;/code&gt;，其他插件可以按需开启。你还可以通过权重控制插件执行顺序，让构建流程更可控。&lt;/p&gt;
&lt;h2 id=&quot;heading-8&quot;&gt;单二进制，部署简单&lt;/h2&gt;
&lt;p&gt;Snow 使用 Go 编写，可以编译成单个二进制文件。没有复杂运行时，没有庞大的依赖链，也不需要在服务器上安装一整套前端工具。&lt;/p&gt;
&lt;p&gt;对于静态站点来说，这非常实用：本地构建，产物上传，或者直接放进 CI/CD 流程，都很干净。&lt;/p&gt;
&lt;h2 id=&quot;heading-9&quot;&gt;适合谁使用？&lt;/h2&gt;
&lt;p&gt;Snow 特别适合这些用户：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;想搭建个人博客或技术博客的开发者&lt;/li&gt;
&lt;li&gt;希望用 Markdown 或 Org-mode 管理内容的写作者&lt;/li&gt;
&lt;li&gt;需要多语言文档站的项目维护者&lt;/li&gt;
&lt;li&gt;想要轻量、可控、易部署静态站点工具的团队&lt;/li&gt;
&lt;li&gt;喜欢 Go 单二进制工具链的用户&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-10&quot;&gt;总结&lt;/h2&gt;
&lt;p&gt;Snow 的优势不在于把每件事都做得庞大复杂，而在于把静态站点生成中真正重要的能力做得清晰、直接、可扩展。&lt;/p&gt;
&lt;p&gt;它支持多格式内容、多语言、分类归档、分页、自定义输出、主题覆盖、实时预览和插件扩展，同时保持了单二进制工具应有的简洁。&lt;/p&gt;
&lt;p&gt;如果你正在寻找一个轻量但不简陋、灵活但不臃肿的静态站点生成器，Snow 值得一试。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/honmaple/snow&quot;&gt;https://github.com/honmaple/snow&lt;/a&gt;&lt;/p&gt;
</content>
        <category term="Tech"></category>
    </entry>
    <entry xml:lang="zh">
      <title>红枫笔记发布1.0.4版本</title>
      <link href="https://honmaple.me/posts/2026/03/maple-note-v0.1.4/" rel="alternate"></link>
      <published>Thu, 12 Mar 2026 12:21:16 +0000</published>
      <updated>Wed, 17 Jun 2026 15:51:37 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2026/03/maple-note-v0.1.4/" type="text/html"/>
      <id>https://honmaple.me/posts/2026/03/maple-note-v0.1.4/</id>
      <summary type="html">
&lt;p&gt;
最近红枫笔记发布了 &lt;b&gt;v1.0.4&lt;/b&gt; 版本，主要更新功能如下:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
 增加&lt;b&gt;数据导出功能&lt;/b&gt;: 可将红枫笔记中的待办事项、纪念日、备忘录及其附件导出到本地
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 增加&lt;b&gt;数据导入功能&lt;/b&gt;: 支持从Flomo、Usememos，或者从红枫笔记自身导出的文件中导入笔记
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 增加&lt;b&gt;数据同步功能&lt;/b&gt;: 支持S3、Webdav的数据同步
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 增加&lt;b&gt;导航功能&lt;/b&gt;：笔记模版、远程服务等功能都能一键直达
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 远程服务增加&lt;b&gt;RSS订阅功能&lt;/b&gt;: 添加RSS链接即可在红枫云盘内查看内容
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;</summary>
      <content type="html">
&lt;p&gt;
最近红枫笔记发布了 &lt;b&gt;v1.0.4&lt;/b&gt; 版本，主要更新功能如下:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
 增加&lt;b&gt;数据导出功能&lt;/b&gt;: 可将红枫笔记中的待办事项、纪念日、备忘录及其附件导出到本地
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 增加&lt;b&gt;数据导入功能&lt;/b&gt;: 支持从Flomo、Usememos，或者从红枫笔记自身导出的文件中导入笔记
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 增加&lt;b&gt;数据同步功能&lt;/b&gt;: 支持S3、Webdav的数据同步
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 增加&lt;b&gt;导航功能&lt;/b&gt;：笔记模版、远程服务等功能都能一键直达
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 远程服务增加&lt;b&gt;RSS订阅功能&lt;/b&gt;: 添加RSS链接即可在红枫云盘内查看内容
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;</content>
        <category term="Life"></category>
    </entry>
    <entry xml:lang="zh">
      <title>使用CloudFS连接本地磁盘与多种云存储</title>
      <link href="https://honmaple.me/posts/2026/03/cloudfs-intro/" rel="alternate"></link>
      <published>Tue, 10 Mar 2026 12:27:10 +0000</published>
      <updated>Thu, 18 Jun 2026 12:53:02 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2026/03/cloudfs-intro/" type="text/html"/>
      <id>https://honmaple.me/posts/2026/03/cloudfs-intro/</id>
      <summary type="html">&lt;p&gt;在应用开发中，文件存储常常不是一个“简单上传下载”的问题。&lt;/p&gt;
&lt;p&gt;你可能会遇到这些场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开发环境使用&lt;strong&gt;本地磁盘&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;生产环境切换到 &lt;strong&gt;S3 对象存储&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;企业内网需要接入 &lt;strong&gt;SMB / SFTP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;用户希望挂载 &lt;strong&gt;WebDAV / OneDrive / Google Drive&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;文件分发依赖 &lt;strong&gt;GitHub Release&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;后续还要支持更多云盘或私有存储服务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果每一种存储都单独适配，业务代码很快就会被各种 SDK、认证方式、路径规则和异常处理淹没。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CloudFS 正是为了解决这个问题而生。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CloudFS 是一个 Go 语言云存储抽象库，它将&lt;strong&gt;本地磁盘、多种云盘和常见存储协议...&lt;/strong&gt;&lt;/p&gt;</summary>
      <content type="html">&lt;p&gt;在应用开发中，文件存储常常不是一个“简单上传下载”的问题。&lt;/p&gt;
&lt;p&gt;你可能会遇到这些场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开发环境使用&lt;strong&gt;本地磁盘&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;生产环境切换到 &lt;strong&gt;S3 对象存储&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;企业内网需要接入 &lt;strong&gt;SMB / SFTP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;用户希望挂载 &lt;strong&gt;WebDAV / OneDrive / Google Drive&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;文件分发依赖 &lt;strong&gt;GitHub Release&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;后续还要支持更多云盘或私有存储服务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果每一种存储都单独适配，业务代码很快就会被各种 SDK、认证方式、路径规则和异常处理淹没。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CloudFS 正是为了解决这个问题而生。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CloudFS 是一个 Go 语言云存储抽象库，它将&lt;strong&gt;本地磁盘、多种云盘和常见存储协议&lt;/strong&gt;统一到一套类似文件系统的接口中。开发者只需要面向 &lt;code&gt;cloudfs.FS&lt;/code&gt; 编程，就可以完成常见文件操作。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;// 列出目录文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;files&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;err&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;:=&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;List&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;ctx&lt;/span&gt;, &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;// 读取文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;r&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;err&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;:=&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Open&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;ctx&lt;/span&gt;, &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;/file.txt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;// 创建或上传文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;w&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;err&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;:=&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Create&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;ctx&lt;/span&gt;, &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;/docs/hello.txt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;// 移动文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;err&lt;/span&gt; = &lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Move&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;ctx&lt;/span&gt;, &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;/old.txt&amp;#34;&lt;/span&gt;, &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;/archive&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;底层到底是本地目录、S3、WebDAV、SFTP、SMB、Google Drive，还是 OneDrive，对于业务代码来说不再重要。&lt;/p&gt;
&lt;h2 id=&quot;heading-1&quot;&gt;多驱动支持，存储接入更自由&lt;/h2&gt;
&lt;p&gt;CloudFS 已内置丰富的驱动支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Local&lt;/strong&gt;：本地文件系统&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FTP / SFTP&lt;/strong&gt;：传统文件传输协议&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S3&lt;/strong&gt;：兼容 S3 的对象存储&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SMB&lt;/strong&gt;：企业内网文件共享&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebDAV&lt;/strong&gt;：常见网盘与文件服务协议&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Drive / OneDrive&lt;/strong&gt;：主流云盘&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub / GitHub Release&lt;/strong&gt;：适合文件分发场景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upyun / Openlist / Foxel&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;115 / Quark&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着你可以用同一套业务逻辑连接不同存储后端。&lt;/p&gt;
&lt;p&gt;典型使用方式包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开发环境使用 &lt;code&gt;local&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;生产环境使用 &lt;code&gt;s3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;企业部署使用 &lt;code&gt;smb&lt;/code&gt; 或 &lt;code&gt;sftp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;个人网盘场景支持 &lt;code&gt;webdav&lt;/code&gt;、&lt;code&gt;gdrive&lt;/code&gt;、&lt;code&gt;onedrive&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文件下载场景接入 &lt;code&gt;github-release&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;直接创建驱动：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;err&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;:=&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;webdav&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;New&lt;/span&gt;(&lt;span style=&quot;color:#f92672&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;webdav&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Option&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Endpoint&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;https://example.com/dav&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Username&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Password&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;pass&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;也可以通过统一工厂动态创建：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;err&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;:=&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;driver&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;New&lt;/span&gt;(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;webdav&amp;#34;&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;map&lt;/span&gt;[&lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;]&lt;span style=&quot;color:#66d9ef&quot;&gt;any&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;endpoint&amp;#34;&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;https://example.com/dav&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;username&amp;#34;&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;pass&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;如果配置已经是 JSON，还可以使用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;driver.NewFromString&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;driver.Exists&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;driver.VerifyOption&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这对于&lt;strong&gt;配置化系统、后台管理平台、插件化应用&lt;/strong&gt;非常友好。&lt;/p&gt;
&lt;h2 id=&quot;heading-2&quot;&gt;中间件机制，让文件系统能力可以组合&lt;/h2&gt;
&lt;p&gt;CloudFS 不只是封装驱动，它还提供了&lt;strong&gt;可组合的中间件机制&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;你可以像搭积木一样增强文件系统能力：&lt;/p&gt;
&lt;ul&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;li&gt;&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;Hook 中间件&lt;/strong&gt;：支持路径映射、文件过滤、自定义处理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prefix 中间件&lt;/strong&gt;：将某个目录前缀映射为文件系统根路径&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;err&lt;/span&gt; = &lt;span style=&quot;color:#a6e22e&quot;&gt;cloudfs&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;New&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;middleware&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;PrefixFS&lt;/span&gt;(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;/data&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;middleware&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;CacheFS&lt;/span&gt;(&lt;span style=&quot;color:#f92672&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;middleware&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;CacheOption&lt;/span&gt;{}),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;h2 id=&quot;heading-3&quot;&gt;像操作文件系统一样操作云端资源&lt;/h2&gt;
&lt;p&gt;CloudFS 的核心接口非常直观：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;type&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;FS&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;interface&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;List&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color:#f92672&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;ListOption&lt;/span&gt;) ([]&lt;span style=&quot;color:#a6e22e&quot;&gt;FileInfo&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Move&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Copy&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Rename&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Remove&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;MakeDir&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Stat&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) (&lt;span style=&quot;color:#a6e22e&quot;&gt;FileInfo&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Open&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) (&lt;span style=&quot;color:#a6e22e&quot;&gt;File&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Create&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) (&lt;span style=&quot;color:#a6e22e&quot;&gt;FileWriter&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Close&lt;/span&gt;() &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;它保留了 Go 开发者熟悉的接口风格：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;io.Reader&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;io.Seeker&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;io.Closer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;io.WriteCloser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;io/fs.FileInfo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，CloudFS 很容易和现有 Go 生态集成。&lt;/p&gt;
&lt;p&gt;文件信息也在标准 &lt;code&gt;io/fs.FileInfo&lt;/code&gt; 基础上增加了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Path()&lt;/code&gt;：完整路径&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Type()&lt;/code&gt;：文件类型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ExtraInfo()&lt;/code&gt;：驱动额外元数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;既保留标准语义，也给不同存储驱动留下扩展空间。&lt;/p&gt;
&lt;h2 id=&quot;heading-4&quot;&gt;快速开始&lt;/h2&gt;
&lt;p&gt;安装 CloudFS：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;go get github.com/honmaple/cloudfs
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;只引入需要的驱动：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;github.com/honmaple/cloudfs/driver/webdav&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;或者一次性注册全部内置驱动：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;_&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;github.com/honmaple/cloudfs/driver/all&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;完整示例：&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;package&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;context&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;strings&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;github.com/honmaple/cloudfs/driver/local&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;func&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;err&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;:=&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;local&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;New&lt;/span&gt;(&lt;span style=&quot;color:#f92672&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;local&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Option&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;        &lt;span style=&quot;color:#a6e22e&quot;&gt;Path&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;/tmp/cloudfs&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;    })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;15&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;err&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;!=&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;16&lt;/span&gt;&lt;span&gt;        panic(&lt;span style=&quot;color:#a6e22e&quot;&gt;err&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;17&lt;/span&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;18&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;defer&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;19&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;20&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;ctx&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;:=&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Background&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;21&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;22&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;_&lt;/span&gt; = &lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;MakeDir&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;ctx&lt;/span&gt;, &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;/docs&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;23&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;24&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;w&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;_&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;:=&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Create&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;ctx&lt;/span&gt;, &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;/docs/hello.txt&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;25&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;_&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;_&lt;/span&gt; = &lt;span style=&quot;color:#a6e22e&quot;&gt;io&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Copy&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;w&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;strings&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;NewReader&lt;/span&gt;(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;hello cloudfs&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;26&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;_&lt;/span&gt; = &lt;span style=&quot;color:#a6e22e&quot;&gt;w&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;27&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;28&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;files&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;_&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;:=&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;fs&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;List&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;ctx&lt;/span&gt;, &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;/docs&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;29&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;_&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;file&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;:=&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;range&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;files&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;30&lt;/span&gt;&lt;span&gt;        println(&lt;span style=&quot;color:#a6e22e&quot;&gt;file&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Path&lt;/span&gt;(), &lt;span style=&quot;color:#a6e22e&quot;&gt;file&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Name&lt;/span&gt;(), &lt;span style=&quot;color:#a6e22e&quot;&gt;file&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Size&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;31&lt;/span&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;32&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;h2 id=&quot;heading-5&quot;&gt;适合哪些项目？&lt;/h2&gt;
&lt;p&gt;CloudFS 特别适合这些场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;网盘系统&lt;/strong&gt;：统一管理本地、WebDAV、S3、云盘等资源&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;li&gt;&lt;strong&gt;同步工具&lt;/strong&gt;：屏蔽不同云服务之间的接口差异&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内容分发服务&lt;/strong&gt;：对接 GitHub Release、S3、WebDAV 等下载源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;企业内部工具&lt;/strong&gt;：同时支持 SMB、SFTP、本地目录等环境&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;插件化平台&lt;/strong&gt;：通过动态驱动注册和 JSON 配置创建文件系统&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你正在为不同存储后端写重复的适配代码，&lt;strong&gt;CloudFS 可以把复杂度收束到一套清晰、统一、可组合的 Go 接口里。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;heading-6&quot;&gt;总结&lt;/h2&gt;
&lt;p&gt;CloudFS 的核心价值可以概括为三点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;统一接口&lt;/strong&gt;：用一套 &lt;code&gt;cloudfs.FS&lt;/code&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;/ul&gt;
&lt;p&gt;对于需要多存储支持的 Go 项目来说，&lt;strong&gt;CloudFS 是一个轻量、清晰、可扩展的基础库&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/honmaple/cloudfs&quot;&gt;https://github.com/honmaple/cloudfs&lt;/a&gt;&lt;/p&gt;
</content>
        <category term="Tech"></category>
    </entry>
    <entry xml:lang="zh">
      <title>知名网盘工具Alist被卖，不用担心，我们还可以使用它</title>
      <link href="https://honmaple.me/posts/2025/06/alist-was-sold/" rel="alternate"></link>
      <published>Fri, 13 Jun 2025 23:22:29 +0000</published>
      <updated>Sat, 11 Jul 2026 01:29:49 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2025/06/alist-was-sold/" type="text/html"/>
      <id>https://honmaple.me/posts/2025/06/alist-was-sold/</id>
      <summary type="html">
&lt;p&gt;
最近几天国内开源界最大的瓜莫过于知名的网盘聚合挂载工具 &lt;b&gt;Alist&lt;/b&gt; 被卖，甚至很可能早在几个月前就已经被卖，只是直到最近，有小伙伴关注到 &lt;b&gt;Alist&lt;/b&gt; 原作者 &lt;b&gt;xhofe&lt;/b&gt; 已经很久没有在Github上出现，而且Alist的文档也被刚注册不久的两个账号修改，甚至添加了企业微信的咨询服务方式，这些都不算什么，最不能让人接受的是在 &lt;b&gt;Pull Request&lt;/b&gt; 中出现了统计并上报所部署机器信息的相关代码
&lt;/p&gt;

&lt;p&gt;

  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-02.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-02.png-thumb&quot;
         alt=&quot;alist-was-sold-02.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/libs/glightbox/glightbox.min.css&quot;&gt;
  &lt;script src=&quot;https://honmaple.me/libs/vanilla-lazyload/lazyload.min.js&quot; defer&gt;&lt;/script&gt;
  &lt;script src=&quot;https://honmaple.me/libs/glightbox/glightbox.min.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lazyload.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lightbox.js&quot; defer&gt;&lt;/script&gt;

&lt;/p&gt;

&lt;p&gt;
开源项目被某某公司收购其实是一件很寻常不过的事情，毕竟作者也要吃饭不是，总不能一直为爱发电，其实 &lt;b&gt;Alist&lt;/b&gt; 这件事之所以闹得这么大，主要有以下几点原因：
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
 收购Alist的公司名声及其“前科”，导致正在使用Alist的小伙伴们不得不对该公司的动机多了几分怀疑，更无法判断其对隐私的保护甚至是否会进行供应链投毒
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 Alist原作者事前没有发布任何声明，直到被网友扒出才确认此事
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 虽然这是一个开源项目，但是部分API比如阿里云盘、百度网盘等的授权是&lt;b&gt;闭源&lt;/b&gt;的，Alist被收购后...&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;</summary>
      <content type="html">
&lt;p&gt;
最近几天国内开源界最大的瓜莫过于知名的网盘聚合挂载工具 &lt;b&gt;Alist&lt;/b&gt; 被卖，甚至很可能早在几个月前就已经被卖，只是直到最近，有小伙伴关注到 &lt;b&gt;Alist&lt;/b&gt; 原作者 &lt;b&gt;xhofe&lt;/b&gt; 已经很久没有在Github上出现，而且Alist的文档也被刚注册不久的两个账号修改，甚至添加了企业微信的咨询服务方式，这些都不算什么，最不能让人接受的是在 &lt;b&gt;Pull Request&lt;/b&gt; 中出现了统计并上报所部署机器信息的相关代码
&lt;/p&gt;

&lt;p&gt;

  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-02.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-02.png-thumb&quot;
         alt=&quot;alist-was-sold-02.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/libs/glightbox/glightbox.min.css&quot;&gt;
  &lt;script src=&quot;https://honmaple.me/libs/vanilla-lazyload/lazyload.min.js&quot; defer&gt;&lt;/script&gt;
  &lt;script src=&quot;https://honmaple.me/libs/glightbox/glightbox.min.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lazyload.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lightbox.js&quot; defer&gt;&lt;/script&gt;

&lt;/p&gt;

&lt;p&gt;
开源项目被某某公司收购其实是一件很寻常不过的事情，毕竟作者也要吃饭不是，总不能一直为爱发电，其实 &lt;b&gt;Alist&lt;/b&gt; 这件事之所以闹得这么大，主要有以下几点原因：
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;
 收购Alist的公司名声及其“前科”，导致正在使用Alist的小伙伴们不得不对该公司的动机多了几分怀疑，更无法判断其对隐私的保护甚至是否会进行供应链投毒
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 Alist原作者事前没有发布任何声明，直到被网友扒出才确认此事
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 虽然这是一个开源项目，但是部分API比如阿里云盘、百度网盘等的授权是&lt;b&gt;闭源&lt;/b&gt;的，Alist被收购后，这部分授权是否会被一同打包给收购的公司我们不得而知
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
虽然 &lt;b&gt;Alist&lt;/b&gt; 被卖，但是这是开源界，一言不合就造轮子的开源界，直到本篇文章发出，已经有了不少大佬fork了原项目，并且将在原有代码的基础上继续维护 &lt;b&gt;Alist&lt;/b&gt;，所以习惯使用 &lt;b&gt;Alist&lt;/b&gt; 的小伙伴们也不用太过担心，也许它只是改了一个名称，比如新的项目 &lt;a href=&quot;https://github.com/OpenListTeam/OpenList&quot;&gt;OpenList&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
除此之外，还有一些同类的网盘聚合和挂载工具，今天向大家介绍的是一款桌面端与手机端的网盘聚合工具—— &lt;b&gt;红枫云盘&lt;/b&gt;
&lt;/p&gt;

&lt;p&gt;

  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-01.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-01.png-thumb&quot;
         alt=&quot;alist-was-sold-01.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;红枫云盘&lt;/b&gt;，这是一个开源且跨平台的多协议云盘文件聚合软件，它不同于Alist，它不需要一台服务器或者Nas进行部署，只需要下载安装，然后打开即可。
&lt;/p&gt;

&lt;p&gt;
红枫云盘目前支持&lt;b&gt;Windows、MacOS、Android、IOS&lt;/b&gt;多种平台，也集成了以下多种存储方式:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 本地文件
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 FTP
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 SFTP
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 S3
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 SMB
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 Webdav
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 Alist
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 又拍云
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 115网盘
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 夸克网盘
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 Github
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 Github Release
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
此外，红枫云盘还拥有以下多种功能:
&lt;/p&gt;
&lt;ul&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;
 支持文件多选及操作
&lt;/p&gt;&lt;/li&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;
 支持视频、音频、图片和文本文件的预览
&lt;/p&gt;&lt;/li&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;/ul&gt;
&lt;p&gt;
文件预览效果：
&lt;/p&gt;
&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;

  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-03.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-03.png-thumb&quot;
         alt=&quot;alist-was-sold-03.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;


  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-04.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-04.png-thumb&quot;
         alt=&quot;alist-was-sold-04.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;


  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-05.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/06/alist-was-sold-05.png-thumb&quot;
         alt=&quot;alist-was-sold-05.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/css/gallery.css&quot;&gt;

&lt;p&gt;
欢迎大家下载使用：&lt;a href=&quot;https://github.com/honmaple/maple-file&quot;&gt;https://github.com/honmaple/maple-file&lt;/a&gt;
&lt;/p&gt;</content>
        <category term="Life"></category>
    </entry>
    <entry xml:lang="zh">
      <title>红枫笔记: 一个有些不一样的Usememos/Blinko/AI客户端</title>
      <link href="https://honmaple.me/posts/2025/06/maple-note/" rel="alternate"></link>
      <published>Sat, 07 Jun 2025 17:42:27 +0000</published>
      <updated>Sat, 11 Jul 2026 01:25:59 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2025/06/maple-note/" type="text/html"/>
      <id>https://honmaple.me/posts/2025/06/maple-note/</id>
      <summary type="html">
&lt;h2 id=&quot;heading-1&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;
   起因是我在之前偶然间看到有人在用微信的&lt;b&gt;文件传输助手&lt;/b&gt;记录临时笔记，我觉得这是一个很好的想法，，但微信的导出是一个很大的问题，不如我自己写一个
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
   &lt;b&gt;红枫笔记，一个用聊天的方式记录并同步你的想法，使用熟悉的聊天窗口记录偶然间的灵感一现&lt;/b&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/10/maple-note-05.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/10/maple-note-05.png-thumb&quot;
         alt=&quot;maple-note-05.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/libs/glightbox/glightbox.min.css&quot;&gt;
  &lt;script src=&quot;https://honmaple.me/libs/vanilla-lazyload/lazyload.min.js&quot; defer&gt;&lt;/script&gt;
  &lt;script src=&quot;https://honmaple.me/libs/glightbox/glightbox.min.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lazyload.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lightbox.js&quot; defer&gt;&lt;/script&gt;

   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/10/maple-note-01.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/10/maple-note-01.png-thumb&quot;
         alt=&quot;maple-note-01.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/10/maple-note-02.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/10/maple-note-02.png-thumb&quot;
         alt=&quot;maple-note-02.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/10/maple-note-03.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/10/maple-note-03.png-thumb&quot;
         alt=&quot;maple-note-03.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/10/maple-note-04.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/10/maple-note-04.png-thumb&quot;
         alt=&quot;maple-note-04.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/css/gallery.css&quot;&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 既然有了聊天窗口，不如来加个好友吧。
&lt;/p&gt;

&lt;p&gt;
     但红枫笔记是一个本地优先的应用，于是我把好友定位为需要同步的远程服务，比如 Usememos 、Blinko ，或者是一个 AI 组手，你向好友发送一条消息，也是向远程服务同步一条笔记，
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 同样的，既然有了好友，不如来建一个群吧。
&lt;/p&gt;

&lt;p&gt;
     使用红枫笔记，你可以把多个远程服务放进一个群聊天里，可以是多组 Usememos 服务，也可以是多个 AI 组手，从而实现&quot;一文多发&quot;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-2&quot;&gt;主要功能...&lt;/h2&gt;</summary>
      <content type="html">
&lt;h2 id=&quot;heading-1&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;
   起因是我在之前偶然间看到有人在用微信的&lt;b&gt;文件传输助手&lt;/b&gt;记录临时笔记，我觉得这是一个很好的想法，，但微信的导出是一个很大的问题，不如我自己写一个
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
   &lt;b&gt;红枫笔记，一个用聊天的方式记录并同步你的想法，使用熟悉的聊天窗口记录偶然间的灵感一现&lt;/b&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/10/maple-note-05.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/10/maple-note-05.png-thumb&quot;
         alt=&quot;maple-note-05.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/libs/glightbox/glightbox.min.css&quot;&gt;
  &lt;script src=&quot;https://honmaple.me/libs/vanilla-lazyload/lazyload.min.js&quot; defer&gt;&lt;/script&gt;
  &lt;script src=&quot;https://honmaple.me/libs/glightbox/glightbox.min.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lazyload.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lightbox.js&quot; defer&gt;&lt;/script&gt;

   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/10/maple-note-01.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/10/maple-note-01.png-thumb&quot;
         alt=&quot;maple-note-01.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/10/maple-note-02.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/10/maple-note-02.png-thumb&quot;
         alt=&quot;maple-note-02.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/10/maple-note-03.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/10/maple-note-03.png-thumb&quot;
         alt=&quot;maple-note-03.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/10/maple-note-04.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/10/maple-note-04.png-thumb&quot;
         alt=&quot;maple-note-04.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/css/gallery.css&quot;&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 既然有了聊天窗口，不如来加个好友吧。
&lt;/p&gt;

&lt;p&gt;
     但红枫笔记是一个本地优先的应用，于是我把好友定位为需要同步的远程服务，比如 Usememos 、Blinko ，或者是一个 AI 组手，你向好友发送一条消息，也是向远程服务同步一条笔记，
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 同样的，既然有了好友，不如来建一个群吧。
&lt;/p&gt;

&lt;p&gt;
     使用红枫笔记，你可以把多个远程服务放进一个群聊天里，可以是多组 Usememos 服务，也可以是多个 AI 组手，从而实现&quot;一文多发&quot;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-2&quot;&gt;主要功能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 书写格式: 支持 Markdown 、拍照、图片、录音等。
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 模版切换: 支持备忘录、待办事项、纪念日等。
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 远程服务: 支持 Usememos 、Blinko ，包括创建更新删除。
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 AI 笔记: 支持 AI 接口及流式输出，目前仅支持文本及一问一答，暂不支持上下文
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-3&quot;&gt;后续计划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 录音转文字
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 webdav/S3 的同步备份
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 AI 功能的完善：支持上下文及图片视频
&lt;/p&gt;&lt;/li&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;/ul&gt;
&lt;h2 id=&quot;heading-4&quot;&gt;下载&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 国区：&lt;a href=&quot;https://apps.apple.com/cn/app/红枫笔记/id6743336280?platform=iphone&quot;&gt;红枫笔记&lt;/a&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 美区：&lt;a href=&quot;https://apps.apple.com/us/app/maplenote-write-note-as-chat/id6743336280?platform=iphone&quot;&gt;maple-note&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   欢迎大家下载试用
&lt;/p&gt;</content>
        <category term="Life"></category>
    </entry>
    <entry xml:lang="zh">
      <title>红枫云盘正式上线App Store</title>
      <link href="https://honmaple.me/posts/2025/03/hong-feng-yun-pan-zheng-shi-shang-xian-app-store/" rel="alternate"></link>
      <published>Sat, 15 Mar 2025 17:25:17 +0000</published>
      <updated>Tue, 18 Mar 2025 15:04:49 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2025/03/hong-feng-yun-pan-zheng-shi-shang-xian-app-store/" type="text/html"/>
      <id>https://honmaple.me/posts/2025/03/hong-feng-yun-pan-zheng-shi-shang-xian-app-store/</id>
      <summary type="html">
&lt;blockquote&gt;
&lt;p&gt;

  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/03/maple-file-app-store.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/03/maple-file-app-store.png-thumb&quot;
         alt=&quot;maple-file-app-store.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/libs/glightbox/glightbox.min.css&quot;&gt;
  &lt;script src=&quot;https://honmaple.me/libs/vanilla-lazyload/lazyload.min.js&quot; defer&gt;&lt;/script&gt;
  &lt;script src=&quot;https://honmaple.me/libs/glightbox/glightbox.min.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lazyload.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lightbox.js&quot; defer&gt;&lt;/script&gt;

&lt;/p&gt;

&lt;p&gt;
欢迎大家下载使用 &lt;a href=&quot;https://apps.apple.com/us/app/maplefile/id6743229674&quot;&gt;https://apps.apple.com/us/app/maplefile/id6743229674&lt;/a&gt;
&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;
第一次上线APP，虽然走了不少弯路，不过总体上线过程还是挺顺利的。3月12日注册的开发者账号，今天（3月15日）即成功上线，大概的流程就是
&lt;/p&gt;

&lt;h2 id=&quot;heading-1&quot;&gt;注册开发者账号&lt;/h2&gt;
&lt;p&gt;
   首先登陆 &lt;a href=&quot;https://developer.apple.com&quot;&gt;https://developer.apple.com&lt;/a&gt;。注意，这里只能使用国区的Apple ID进行注册，我第一次使用美区ID，但是需要美国的身份证明，换成国区ID后才成功注册。
&lt;/p&gt;

&lt;p&gt;
   第一天注册苹果会在48小时内进行审核，我刚开始还以为在成功缴费 &lt;b&gt;688元&lt;/b&gt; 后就行，但一直没有下一步，后来联系了苹果的支持，收到回复注册的开发者账号会在48小时内审核...&lt;/p&gt;</summary>
      <content type="html">
&lt;blockquote&gt;
&lt;p&gt;

  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/03/maple-file-app-store.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/03/maple-file-app-store.png-thumb&quot;
         alt=&quot;maple-file-app-store.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/libs/glightbox/glightbox.min.css&quot;&gt;
  &lt;script src=&quot;https://honmaple.me/libs/vanilla-lazyload/lazyload.min.js&quot; defer&gt;&lt;/script&gt;
  &lt;script src=&quot;https://honmaple.me/libs/glightbox/glightbox.min.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lazyload.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lightbox.js&quot; defer&gt;&lt;/script&gt;

&lt;/p&gt;

&lt;p&gt;
欢迎大家下载使用 &lt;a href=&quot;https://apps.apple.com/us/app/maplefile/id6743229674&quot;&gt;https://apps.apple.com/us/app/maplefile/id6743229674&lt;/a&gt;
&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;
第一次上线APP，虽然走了不少弯路，不过总体上线过程还是挺顺利的。3月12日注册的开发者账号，今天（3月15日）即成功上线，大概的流程就是
&lt;/p&gt;

&lt;h2 id=&quot;heading-1&quot;&gt;注册开发者账号&lt;/h2&gt;
&lt;p&gt;
   首先登陆 &lt;a href=&quot;https://developer.apple.com&quot;&gt;https://developer.apple.com&lt;/a&gt;。注意，这里只能使用国区的Apple ID进行注册，我第一次使用美区ID，但是需要美国的身份证明，换成国区ID后才成功注册。
&lt;/p&gt;

&lt;p&gt;
   第一天注册苹果会在48小时内进行审核，我刚开始还以为在成功缴费 &lt;b&gt;688元&lt;/b&gt; 后就行，但一直没有下一步，后来联系了苹果的支持，收到回复注册的开发者账号会在48小时内审核。不过也不用48小时，我头天下午注册的，第二天早上9点多就收到了身份验证的邮件，因为注册用的是国区的ID，所以需要提交身份证照片，提交后一个小时内即审核通过。
&lt;/p&gt;

&lt;p&gt;
   审核通过后就能在开发者页面看到 &lt;b&gt;计划资源&lt;/b&gt;，否则会提示需要审核
&lt;/p&gt;

&lt;p&gt;
   
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/03/maple-file-app-store-02.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/03/maple-file-app-store-02.png-thumb&quot;
         alt=&quot;maple-file-app-store-02.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;h2 id=&quot;heading-2&quot;&gt;软件准备(Flutter)&lt;/h2&gt;
&lt;p&gt;
   这里我走了不少弯路，在网上搜索相关教程时又要本地创建证书，又要申请Profile的，其实不必这么麻烦。
&lt;/p&gt;

&lt;p&gt;
   首先点击 &lt;b&gt;计划资源&lt;/b&gt; 里的 &lt;b&gt;标识符 (英文)&lt;/b&gt;，然后点击 + 号，依次选择 &lt;b&gt;App IDs&lt;/b&gt; -&amp;gt; &lt;b&gt;App&lt;/b&gt;，然后输入 &lt;b&gt;Bundle ID&lt;/b&gt; 及 &lt;b&gt;Description&lt;/b&gt;。如果需要在手机上进行测试，则需要在设备(Devices)里添加相应的设备，其中 &lt;b&gt;Device ID (UDID)&lt;/b&gt; 可以使用 Xcode，选择&lt;b&gt;Windows&lt;/b&gt; -&amp;gt; &lt;b&gt;Devices And Simulators&lt;/b&gt;查看。
&lt;/p&gt;

&lt;p&gt;
   接下来就不需要在网页上创建证书，只需要打开 Xcode，选择 &lt;b&gt;Runner(TARGETS)&lt;/b&gt; -&amp;gt; &lt;b&gt;Signing &amp; Capabilities&lt;/b&gt;, 勾选 &lt;b&gt;Automatically manage signing&lt;/b&gt; 并选择 &lt;b&gt;Team&lt;/b&gt;，然后输入 &lt;b&gt;Bundle Identifier&lt;/b&gt; 即可
&lt;/p&gt;

&lt;h2 id=&quot;heading-3&quot;&gt;图标设计&lt;/h2&gt;
&lt;p&gt;
   相关的环境准备好后，就到了最耗时也最难（对于我而言）的 &lt;b&gt;图标设计&lt;/b&gt;。
&lt;/p&gt;

&lt;p&gt;
   对于一个没有学过UI设计的人来说，这确实是难题，虽然现在已有了AI的加持，但生成的设计图都不太符合我的审美，更重要的是，即使生成了一张符合的图片，但要把它转换为可用的APP图标还需要进行一系列的裁剪和修改，比如在MacOS上一个 &lt;code&gt;1024 * 1024&lt;/code&gt; 的图标就需要设置外边缘为&lt;code&gt;10%&lt;/code&gt;，即图标大小应为 &lt;code&gt;819.2像素&lt;/code&gt;，底部图层为透明色，除此之外，还需要设置图标的圆角大小为 &lt;code&gt;179.649&lt;/code&gt;，这些对于设计人员非常常见的参数，对于我却花费了不少时间。
&lt;/p&gt;

&lt;p&gt;
   在经过对AI生成的原图片进行不断地抠图、裁剪，但还是不满意之后，最后我还是决定自己绘制矢量图(SVG)，于是我通过搜索找到了 &lt;a href=&quot;https://inkscape.org&quot;&gt;Inkscape&lt;/a&gt;  这个软件，并在B站学习了两天半的时间，简单上手之后参考原图片自己绘制了红枫云盘的图标，还算不错（个人觉得，哈哈）。
&lt;/p&gt;

&lt;p&gt;
   有了图标后，就能使用 &lt;code&gt;flutter_launcher_icons&lt;/code&gt; 这个插件就能快速生成IOS/MacOS/Android的图标
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;flutter_launcher_icons&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;android&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;launcher_icon&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;image_path&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;assets/icon/icon.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;web&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;generate&lt;/span&gt;: &lt;span style=&quot;color:#66d9ef&quot;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;image_path&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;assets/icon/icon.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;windows&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;generate&lt;/span&gt;: &lt;span style=&quot;color:#66d9ef&quot;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;image_path&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;assets/icon/icon.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;ios&lt;/span&gt;: &lt;span style=&quot;color:#66d9ef&quot;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;image_path_ios&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;assets/icon/icon.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;remove_alpha_ios&lt;/span&gt;: &lt;span style=&quot;color:#66d9ef&quot;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;background_color_ios&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;#ffffff&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;macos&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;15&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;generate&lt;/span&gt;: &lt;span style=&quot;color:#66d9ef&quot;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;16&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;image_path&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;assets/icon/icon-macos.png&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
   同样的，也能使用 &lt;code&gt;flutter_native_splash&lt;/code&gt; 快速生成启动图
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;flutter_native_splash&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;color&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;#ffffff&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;color_dark&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;#121212&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;image&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;assets/icon/icon.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;android_12&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;image&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;assets/icon/icon.png&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;icon_background_color&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;#ffffff&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;icon_background_color_dark&lt;/span&gt;: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;#121212&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;web&lt;/span&gt;: &lt;span style=&quot;color:#66d9ef&quot;&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h2 id=&quot;heading-4&quot;&gt;IPA上传&lt;/h2&gt;
&lt;p&gt;
   使用 &lt;code&gt;flutter build ipa&lt;/code&gt; 生成ipa文件，不需要在Xcode上操作，然后使用 &lt;b&gt;Transporter&lt;/b&gt; 这个苹果官方的软件进行上传，上传后的文件可在下一步里的 &lt;b&gt;构建版本&lt;/b&gt; 中选择。
&lt;/p&gt;

&lt;p&gt;
  
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2025/03/maple-file-app-store-03.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2025/03/maple-file-app-store-03.png-thumb&quot;
         alt=&quot;maple-file-app-store-03.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;h2 id=&quot;heading-5&quot;&gt;提交审核&lt;/h2&gt;
&lt;p&gt;
   首先登陆 &lt;a href=&quot;https://appstoreconnect.apple.com/apps&quot;&gt;https://appstoreconnect.apple.com/apps&lt;/a&gt;，创建好APP，并填写好相关的表单，上传好对应的截图，在 &lt;b&gt;构建版本&lt;/b&gt; 中选择上传的IPA文件。
&lt;/p&gt;

&lt;p&gt;
   这一步确实有很多表单要填写，包括 &lt;b&gt;App信息&lt;/b&gt;、&lt;b&gt;App隐私&lt;/b&gt;、&lt;b&gt;价格与销售范围&lt;/b&gt;，如果是付费App，还需要签署一些协议，添加银行卡，不过只要认真填写，在审核这一步能减少非常多与客服掰扯的时间，就像我一样，提交审核后一次就能通过，不需要反复地修改
&lt;/p&gt;

&lt;p&gt;
   注意：如果想上架国区，还需要进行&lt;b&gt;App备案&lt;/b&gt;，虽然我已经有了一个已备案的域名和服务器，但App备案是要重新提交并申请的，挺麻烦的，大概吧，所以红枫云盘是未上架国区的，也是唯一未上架的区域，如果想要下载使用，则需要使用其它区的Apple ID
&lt;/p&gt;

&lt;h2 id=&quot;heading-6&quot;&gt;其它&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 CNAPS(联行号)查看: &lt;a href=&quot;https://www.cwjyz.com.cn/bank/index.html&quot;&gt;https://www.cwjyz.com.cn/bank/index.html&lt;/a&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 缺少出口合规证明: &lt;code&gt;Info.plist&lt;/code&gt;中添加
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;ITSAppUsesNonExemptEncryption&amp;lt;/key&amp;gt;&amp;lt;false/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
        <category term="Tech/Coding/Flutter"></category>
    </entry>
    <entry xml:lang="zh">
      <title>红枫云盘版本发布记录</title>
      <link href="https://honmaple.me/posts/2025/02/hong-feng-yun-pan-ban-ben-fa-bu-ji-lu/" rel="alternate"></link>
      <published>Fri, 14 Feb 2025 17:55:50 +0000</published>
      <updated>Tue, 03 Feb 2026 13:40:38 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2025/02/hong-feng-yun-pan-ban-ben-fa-bu-ji-lu/" type="text/html"/>
      <id>https://honmaple.me/posts/2025/02/hong-feng-yun-pan-ban-ben-fa-bu-ji-lu/</id>
      <summary type="html">&lt;h2 id=&quot;heading-1&quot;&gt;&lt;code&gt;v1.2.0&lt;/code&gt; (2025-11-06)&lt;/h2&gt;
&lt;h3 id=&quot;heading-1.1&quot;&gt;新增&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;服务增加验证机制及优化服务启动&lt;/li&gt;
&lt;li&gt;可开启webdav服务&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-1.2&quot;&gt;修复&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CFB文件解密&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-1.3&quot;&gt;优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;缩略图存储路径&lt;/li&gt;
&lt;li&gt;界面显示问题若干&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-2&quot;&gt;&lt;code&gt;v1.1.0&lt;/code&gt; (2025-10-24)&lt;/h2&gt;
&lt;h3 id=&quot;heading-2.1&quot;&gt;新增&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;访问频率限制&lt;/li&gt;
&lt;li&gt;文件加密支持 &lt;strong&gt;OFB&lt;/strong&gt; 和 &lt;strong&gt;CTR&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-2.2&quot;&gt;修复&lt;/h3&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;h3 id=&quot;heading-2.3&quot;&gt;优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通知从 &lt;strong&gt;snackbar&lt;/strong&gt; 切换至 &lt;strong&gt;smartDialog&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-3&quot;&gt;&lt;code&gt;v1...&lt;/code&gt;&lt;/h2&gt;</summary>
      <content type="html">&lt;h2 id=&quot;heading-1&quot;&gt;&lt;code&gt;v1.2.0&lt;/code&gt; (2025-11-06)&lt;/h2&gt;
&lt;h3 id=&quot;heading-1.1&quot;&gt;新增&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;服务增加验证机制及优化服务启动&lt;/li&gt;
&lt;li&gt;可开启webdav服务&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-1.2&quot;&gt;修复&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CFB文件解密&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-1.3&quot;&gt;优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;缩略图存储路径&lt;/li&gt;
&lt;li&gt;界面显示问题若干&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-2&quot;&gt;&lt;code&gt;v1.1.0&lt;/code&gt; (2025-10-24)&lt;/h2&gt;
&lt;h3 id=&quot;heading-2.1&quot;&gt;新增&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;访问频率限制&lt;/li&gt;
&lt;li&gt;文件加密支持 &lt;strong&gt;OFB&lt;/strong&gt; 和 &lt;strong&gt;CTR&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-2.2&quot;&gt;修复&lt;/h3&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;h3 id=&quot;heading-2.3&quot;&gt;优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通知从 &lt;strong&gt;snackbar&lt;/strong&gt; 切换至 &lt;strong&gt;smartDialog&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-3&quot;&gt;&lt;code&gt;v1.0.9&lt;/code&gt; (2025-06-12)&lt;/h2&gt;
&lt;h3 id=&quot;heading-3.1&quot;&gt;新增&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;115网盘(不支持上传)&lt;/li&gt;
&lt;li&gt;夸克网盘(不支持上传)&lt;/li&gt;
&lt;li&gt;S3增加 &lt;code&gt;force_path_style&lt;/code&gt; 和 &lt;code&gt;session_token&lt;/code&gt; 参数&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-3.2&quot;&gt;修复&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;大文件上传错误&lt;/li&gt;
&lt;li&gt;Github文件获取错误&lt;/li&gt;
&lt;li&gt;阿里云OSS需设置 &lt;code&gt;force_path_style&lt;/code&gt; 为 &lt;code&gt;false&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-4&quot;&gt;&lt;code&gt;v1.0.8&lt;/code&gt; (2025-05-01)&lt;/h2&gt;
&lt;h3 id=&quot;heading-4.1&quot;&gt;新增&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ios支持&lt;/li&gt;
&lt;li&gt;文件排序支持目录优先&lt;/li&gt;
&lt;li&gt;移动端视频播放支持mkv格式&lt;/li&gt;
&lt;li&gt;支持 &lt;strong&gt;Github&lt;/strong&gt; 和 &lt;strong&gt;Github Release&lt;/strong&gt; 存储(只读)&lt;/li&gt;
&lt;li&gt;增加启动Logo页面&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-4.2&quot;&gt;修复&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;应用置于后台时并重新打开时服务断开&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-4.3&quot;&gt;优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;视频、音频、图片的预览&lt;/li&gt;
&lt;li&gt;MacOS端bookmark优化&lt;/li&gt;
&lt;li&gt;移除部分不必要的包依赖&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-5&quot;&gt;&lt;code&gt;v1.0.5&lt;/code&gt; (2025-02-16)&lt;/h2&gt;
&lt;h3 id=&quot;heading-5.1&quot;&gt;新增&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;桌面端增加右键菜单&lt;/li&gt;
&lt;li&gt;应用数据可选备份至云盘或者本地&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-5.2&quot;&gt;修复&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;重试任务时应用退出&lt;/li&gt;
&lt;li&gt;任务列表图标颜色同主题保持一致&lt;/li&gt;
&lt;li&gt;MacOS沙盒模式下本地存储访问受限&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-5.3&quot;&gt;优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MacOS下应用图标使用白色背景&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-6&quot;&gt;&lt;code&gt;v1.0.4&lt;/code&gt; (2025-02-03)&lt;/h2&gt;
&lt;h3 id=&quot;heading-6.1&quot;&gt;新增&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;文件拖拽上传支持文件夹&lt;/li&gt;
&lt;li&gt;文件列表信息缓存&lt;/li&gt;
&lt;li&gt;S3存储增加 &lt;code&gt;list_version&lt;/code&gt; 选项&lt;/li&gt;
&lt;li&gt;SMB存储增加 &lt;code&gt;domain&lt;/code&gt; 选项&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-6.2&quot;&gt;依赖&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Flutter版本升级至&lt;strong&gt;3.27.3&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-6.3&quot;&gt;修复&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Alist根目录无法上传/新建目录/移动/复制&lt;/li&gt;
&lt;li&gt;拖拽文件导致重复上传 &lt;a href=&quot;https://github.com/honmaple/maple-file/issues/25&quot;&gt;issue25&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-6.4&quot;&gt;优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;添加/修改存储时，更多设置使用卡片分隔不同的选项&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-7&quot;&gt;&lt;code&gt;v1.0.3&lt;/code&gt; (2025-01-24)&lt;/h2&gt;
&lt;h3 id=&quot;heading-7.1&quot;&gt;新增&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新增帮助文档，并使用外部浏览器查看&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-7.2&quot;&gt;修复&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修复自定义&lt;strong&gt;挂载目录&lt;/strong&gt;在非根目录&lt;code&gt;/&lt;/code&gt;时的问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-7.3&quot;&gt;优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;strong&gt;flex_color_scheme&lt;/strong&gt; 优化界面主题和颜色&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-8&quot;&gt;&lt;code&gt;v1.0.2&lt;/code&gt; (2025-01-09)&lt;/h2&gt;
&lt;h3 id=&quot;heading-8.1&quot;&gt;新增&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;windows&lt;/strong&gt;支持&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-8.2&quot;&gt;移除&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;同步备份功能(bug较多无法使用)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;heading-8.3&quot;&gt;优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;桌面端UI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-9&quot;&gt;&lt;code&gt;v1.0.1&lt;/code&gt; (2025-01-06)&lt;/h2&gt;
&lt;h3 id=&quot;heading-9.1&quot;&gt;新增&lt;/h3&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;h3 id=&quot;heading-9.2&quot;&gt;优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;界面优化&lt;/li&gt;
&lt;/ul&gt;
</content>
        <category term="Tech/Coding/Flutter"></category>
    </entry>
    <entry xml:lang="zh">
      <title>红枫云盘发布v1.0.1版本，支持文件加密、压缩以及回收站功能</title>
      <link href="https://honmaple.me/posts/2025/01/红枫云盘v1.0.1/" rel="alternate"></link>
      <published>Mon, 06 Jan 2025 15:32:50 +0000</published>
      <updated>Tue, 14 Jan 2025 16:26:58 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2025/01/红枫云盘v1.0.1/" type="text/html"/>
      <id>https://honmaple.me/posts/2025/01/红枫云盘v1.0.1/</id>
      <summary type="html">
&lt;blockquote&gt;
&lt;p&gt;
距离红枫云盘第一次发布已经过去了一个多月，这期间很感谢阮一峰大佬的推荐，上了2024年最后一期 &lt;a href=&quot;https://github.com/ruanyf/weekly&quot;&gt;科技爱好者周刊&lt;/a&gt;，在短短几天时间就涨了 &lt;b&gt;150&lt;/b&gt; 多个Star ，今天发布了最新的 &lt;a href=&quot;https://github.com/honmaple/maple-file/releases/tag/v1.0.1&quot;&gt;v1.0.1版本&lt;/a&gt;，对比上一次有了重大更新，也带来了更多功能
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;heading-1&quot;&gt;文件加密&lt;/h2&gt;
&lt;p&gt;
   采用 &lt;b&gt;AES&lt;/b&gt; 加密算法，自动对上传或者复制到此存储的文件进行加密，客户端查看或下载时自动解密，再也不用担心上传的视频变成&lt;b&gt;8秒教育片&lt;/b&gt;
&lt;/p&gt;

&lt;p&gt;
   相关参数:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;文件密码&lt;/b&gt;: 文件加密密码，不能为空
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;文件后缀&lt;/b&gt;: 默认为空，当设置为 &lt;code&gt;.bin&lt;/code&gt; 时，加密后的文件，文件名称会自动添加 &lt;code&gt;.bin&lt;/code&gt; 后缀
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;文件密码加密&lt;/b&gt;: 默认和文件密码相同...&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</summary>
      <content type="html">
&lt;blockquote&gt;
&lt;p&gt;
距离红枫云盘第一次发布已经过去了一个多月，这期间很感谢阮一峰大佬的推荐，上了2024年最后一期 &lt;a href=&quot;https://github.com/ruanyf/weekly&quot;&gt;科技爱好者周刊&lt;/a&gt;，在短短几天时间就涨了 &lt;b&gt;150&lt;/b&gt; 多个Star ，今天发布了最新的 &lt;a href=&quot;https://github.com/honmaple/maple-file/releases/tag/v1.0.1&quot;&gt;v1.0.1版本&lt;/a&gt;，对比上一次有了重大更新，也带来了更多功能
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;heading-1&quot;&gt;文件加密&lt;/h2&gt;
&lt;p&gt;
   采用 &lt;b&gt;AES&lt;/b&gt; 加密算法，自动对上传或者复制到此存储的文件进行加密，客户端查看或下载时自动解密，再也不用担心上传的视频变成&lt;b&gt;8秒教育片&lt;/b&gt;
&lt;/p&gt;

&lt;p&gt;
   相关参数:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;文件密码&lt;/b&gt;: 文件加密密码，不能为空
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;文件后缀&lt;/b&gt;: 默认为空，当设置为 &lt;code&gt;.bin&lt;/code&gt; 时，加密后的文件，文件名称会自动添加 &lt;code&gt;.bin&lt;/code&gt; 后缀
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;文件密码加密&lt;/b&gt;: 默认和文件密码相同，类似二次密码
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;文件名称加密&lt;/b&gt;: 默认不加密，加密后的名称会出现 &lt;code&gt;LKXPGd-ub3Jyu9msrZM5F2EETxxx&lt;/code&gt; 等形式
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;目录名称加密&lt;/b&gt;: 默认不加密，加密后的名称同上
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   &lt;b&gt;注意&lt;/b&gt;: 文件加密只能使用空目录，并对此空目录上传/复制文件(因为红枫云盘不知道你原来的文件是否已经加密)，并且开启后&lt;b&gt;不能修改加密相关的存储配置&lt;/b&gt;，否则将会导致无法打开已加密的文件，包括预览，下载等功能都会失效
&lt;/p&gt;
&lt;h2 id=&quot;heading-2&quot;&gt;文件压缩&lt;/h2&gt;
&lt;p&gt;
   采用 &lt;b&gt;GZIP&lt;/b&gt; 压缩算法, 自动对上传或者复制到此存储的文件进行压缩，客户端查看或下载时自动解压缩
&lt;/p&gt;

&lt;p&gt;
   相关参数:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;&lt;b&gt;压缩水平&lt;/b&gt;&lt;/b&gt;: 可选默认、压缩率最高、压缩速度最快三种方式
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   &lt;b&gt;注意&lt;/b&gt;: 同文件加密一样，文件压缩只能使用空目录，并且开启后&lt;b&gt;不能修改压缩相关的存储配置&lt;/b&gt;
&lt;/p&gt;
&lt;h2 id=&quot;heading-3&quot;&gt;回收站&lt;/h2&gt;
&lt;p&gt;
   删除文件时自动转为重命名文件(增加时间后缀)并移动到指定目录，想要恢复文件则进入回收站路径找到文件并复制到其它目录即可
&lt;/p&gt;

&lt;p&gt;
   相关参数:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;b&gt;&lt;b&gt;回收站路径&lt;/b&gt;&lt;/b&gt;: 默认为空，为空时将会在存储的根目录创建一个名为 &lt;code&gt;.maplerecycle&lt;/code&gt; 的目录。回收站路径应当尽量避免使用常用的子路径，比如常用 &lt;code&gt;/a/b&lt;/code&gt;, 则不要设置回收站路径为 &lt;code&gt;/a/b&lt;/code&gt; 目录下的路径，否则删除目录转为移动目录时会出现问题
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-4&quot;&gt;文件拖拽上传&lt;/h2&gt;
&lt;p&gt;
   桌面端增加文件拖拽上传，当前只支持文件，不支持目录拖拽
&lt;/p&gt;
&lt;h2 id=&quot;heading-5&quot;&gt;Web支持&lt;/h2&gt;
&lt;p&gt;
   浏览器也能管理文件，这样就能通过 &lt;b&gt;Docker&lt;/b&gt; 将红枫云盘部署到服务器或NAS
&lt;/p&gt;</content>
        <category term="Tech/Coding/Flutter"></category>
    </entry>
    <entry xml:lang="zh">
      <title>开源一个离线版Alist，无需服务端部署即可管理云盘文件</title>
      <link href="https://honmaple.me/posts/2024/12/kai-yuan-ge-chi-xian-ban-alist-wu-xu-fu-wu-duan-bu-shu-ji-ke-guan-li-yun-pan-wen-jian/" rel="alternate"></link>
      <published>Mon, 02 Dec 2024 13:09:48 +0000</published>
      <updated>Sat, 11 Jul 2026 01:21:50 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2024/12/kai-yuan-ge-chi-xian-ban-alist-wu-xu-fu-wu-duan-bu-shu-ji-ke-guan-li-yun-pan-wen-jian/" type="text/html"/>
      <id>https://honmaple.me/posts/2024/12/kai-yuan-ge-chi-xian-ban-alist-wu-xu-fu-wu-duan-bu-shu-ji-ke-guan-li-yun-pan-wen-jian/</id>
      <summary type="html">
&lt;blockquote&gt;
&lt;p&gt;
&lt;b&gt;Alist&lt;/b&gt; 是一个非常不错的云盘文件管理程序，不过需要一台服务器或者 &lt;b&gt;Nas&lt;/b&gt; 进行部署，当然，这也同样便于在网络分享文件。但如果只是个人使用，服务器部署以及多账户系统未免有些麻烦。我是一个怕麻烦的人，虽然我自己也在 &lt;b&gt;Nas&lt;/b&gt; 中部署了一个 &lt;b&gt;Alist&lt;/b&gt; 服务，但还是想要一个单独的 &lt;b&gt;离线版APP&lt;/b&gt;，&lt;b&gt;红枫云盘&lt;/b&gt; 就由此诞生。
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
&lt;b&gt;红枫云盘&lt;/b&gt; 即 &lt;a href=&quot;https://github.com/honmaple/maple-file&quot;&gt;maple-file&lt;/a&gt;，名称由 &lt;b&gt;maple(枫叶)&lt;/b&gt; + &lt;b&gt;file(文件)&lt;/b&gt; 组成， 这原本是我很早之前写的一个基于 &lt;b&gt;Flask&lt;/b&gt; 的项目，主要用于图片上传，还有相册的功能，但已经很久没有使用和维护过了...&lt;/p&gt;</summary>
      <content type="html">
&lt;blockquote&gt;
&lt;p&gt;
&lt;b&gt;Alist&lt;/b&gt; 是一个非常不错的云盘文件管理程序，不过需要一台服务器或者 &lt;b&gt;Nas&lt;/b&gt; 进行部署，当然，这也同样便于在网络分享文件。但如果只是个人使用，服务器部署以及多账户系统未免有些麻烦。我是一个怕麻烦的人，虽然我自己也在 &lt;b&gt;Nas&lt;/b&gt; 中部署了一个 &lt;b&gt;Alist&lt;/b&gt; 服务，但还是想要一个单独的 &lt;b&gt;离线版APP&lt;/b&gt;，&lt;b&gt;红枫云盘&lt;/b&gt; 就由此诞生。
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
&lt;b&gt;红枫云盘&lt;/b&gt; 即 &lt;a href=&quot;https://github.com/honmaple/maple-file&quot;&gt;maple-file&lt;/a&gt;，名称由 &lt;b&gt;maple(枫叶)&lt;/b&gt; + &lt;b&gt;file(文件)&lt;/b&gt; 组成， 这原本是我很早之前写的一个基于 &lt;b&gt;Flask&lt;/b&gt; 的项目，主要用于图片上传，还有相册的功能，但已经很久没有使用和维护过了。本来我准备把新项目起名为 &lt;b&gt;Filesea&lt;/b&gt;，但又和我的另一个类似 &lt;b&gt;Alist&lt;/b&gt; 的项目名相同(未开源)，而且 &lt;b&gt;Filesea&lt;/b&gt; 和一个知名项目 &lt;b&gt;Seafile&lt;/b&gt; 过于相似，所以还是继续沿用之前的名称，毕竟对比之前的纯API也算得上是一个全新的升级和改版
&lt;/p&gt;

&lt;h2 id=&quot;heading-1&quot;&gt;功能&lt;/h2&gt;
&lt;p&gt;
   目前已经支持的存储：
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 local(本地文件)
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 smb
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 ftp
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 sftp
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 webdav
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 alist
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 又拍云
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   包括了文件上传、下载、重命名、移动、复制、创建文件夹、预览等功能，虽然部分功能比如预览还比较简陋，但持续优化中，未来可能会添加相册，文件同步和备份等功能
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 文件列表
&lt;/p&gt;
&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_01.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_01.png-thumb&quot;
         alt=&quot;flutter_01.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/libs/glightbox/glightbox.min.css&quot;&gt;
  &lt;script src=&quot;https://honmaple.me/libs/vanilla-lazyload/lazyload.min.js&quot; defer&gt;&lt;/script&gt;
  &lt;script src=&quot;https://honmaple.me/libs/glightbox/glightbox.min.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lazyload.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lightbox.js&quot; defer&gt;&lt;/script&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_02.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_02.png-thumb&quot;
         alt=&quot;flutter_02.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_03.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_03.png-thumb&quot;
         alt=&quot;flutter_03.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/css/gallery.css&quot;&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 文件预览: 支持文本文件，图片，音频，视频
&lt;/p&gt;
&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_16.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_16.png-thumb&quot;
         alt=&quot;flutter_16.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_17.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_17.png-thumb&quot;
         alt=&quot;flutter_17.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_07.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_07.png-thumb&quot;
         alt=&quot;flutter_07.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_08.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_08.png-thumb&quot;
         alt=&quot;flutter_08.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_09.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_09.png-thumb&quot;
         alt=&quot;flutter_09.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 上传和下载
&lt;/p&gt;
&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_10.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_10.png-thumb&quot;
         alt=&quot;flutter_10.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_11.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_11.png-thumb&quot;
         alt=&quot;flutter_11.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 重命名、移动、复制(包括多选)
&lt;/p&gt;
&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_04.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_04.png-thumb&quot;
         alt=&quot;flutter_04.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_05.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_05.png-thumb&quot;
         alt=&quot;flutter_05.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_06.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_06.png-thumb&quot;
         alt=&quot;flutter_06.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 添加修改存储
&lt;/p&gt;
&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_14.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_14.png-thumb&quot;
         alt=&quot;flutter_14.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_13.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_13.png-thumb&quot;
         alt=&quot;flutter_13.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 设置
&lt;/p&gt;
&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_18.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_18.png-thumb&quot;
         alt=&quot;flutter_18.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_12.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_12.png-thumb&quot;
         alt=&quot;flutter_12.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/2024/12/flutter_15.png-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/2024/12/flutter_15.png-thumb&quot;
         alt=&quot;flutter_15.png&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-2&quot;&gt;使用&lt;/h2&gt;
&lt;p&gt;
   目前提供了Android版本和MacOS版本的下载，下载地址: &lt;a href=&quot;https://github.com/honmaple/maple-file/releases/tag/v1.0.0&quot;&gt;https://github.com/honmaple/maple-file/releases/tag/v1.0.0&lt;/a&gt;
&lt;/p&gt;

&lt;h2 id=&quot;heading-3&quot;&gt;开发&lt;/h2&gt;
&lt;p&gt;
   我参考了 &lt;a href=&quot;https://github.com/GopeedLab/gopeed&quot;&gt;Gopeed&lt;/a&gt; 和 &lt;a href=&quot;https://github.com/fregie/pho&quot;&gt;Pho&lt;/a&gt; 两个项目，客户端使用 &lt;b&gt;Flutter&lt;/b&gt;，后端服务使用 &lt;b&gt;Go&lt;/b&gt;，通过 &lt;code&gt;gomobile&lt;/code&gt; 把 &lt;b&gt;Go&lt;/b&gt; 服务打包成 &lt;code&gt;aar(安卓)&lt;/code&gt;，或者利用 &lt;code&gt;buildmode&lt;/code&gt; 打包成 &lt;code&gt;.dylib(MacOS)&lt;/code&gt;, 这样就能把服务端嵌入到本地客户端，来达到 &lt;b&gt;serverless&lt;/b&gt; 的目的。
&lt;/p&gt;

&lt;p&gt;
   如果想要添加更多存储，只需要使用 &lt;b&gt;Go&lt;/b&gt; 创建一个文件系统接口
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;type&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;FS&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;interface&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;WalkDir&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color:#a6e22e&quot;&gt;WalkDirFunc&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;List&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) ([]&lt;span style=&quot;color:#a6e22e&quot;&gt;File&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Move&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Copy&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Rename&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Remove&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;MakeDir&lt;/span&gt;(&lt;span style=&quot;color:#a6e22e&quot;&gt;context&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Context&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Get&lt;/span&gt;(&lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) (&lt;span style=&quot;color:#a6e22e&quot;&gt;File&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Open&lt;/span&gt;(&lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) (&lt;span style=&quot;color:#a6e22e&quot;&gt;FileReader&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Create&lt;/span&gt;(&lt;span style=&quot;color:#66d9ef&quot;&gt;string&lt;/span&gt;) (&lt;span style=&quot;color:#a6e22e&quot;&gt;FileWriter&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;Close&lt;/span&gt;() &lt;span style=&quot;color:#66d9ef&quot;&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   然后注册一个新的存储名称
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;// 注册服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;func&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;init&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#a6e22e&quot;&gt;driver&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Register&lt;/span&gt;(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;alist&amp;#34;&lt;/span&gt;, &lt;span style=&quot;color:#66d9ef&quot;&gt;func&lt;/span&gt;() &lt;span style=&quot;color:#a6e22e&quot;&gt;driver&lt;/span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;Option&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;        &lt;span style=&quot;color:#66d9ef&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;Option&lt;/span&gt;{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;    })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;// 加载服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;   &lt;span style=&quot;color:#a6e22e&quot;&gt;_&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;github.com/honmaple/maple-file/server/pkg/driver/alist&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   最后在客户端创建一个用于提交配置的表单即可，扩展性足够简单，也足够方便
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;DriverFormField(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;  label: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;用户&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;.tr(context),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;  value: _option[&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;username&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;  isRequired: &lt;span style=&quot;color:#66d9ef&quot;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;  onTap: (result) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;    setState(() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;      _option[&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;username&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;] &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;    });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;    widget.form.option &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; jsonEncode(_option);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;DriverFormField(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;15&lt;/span&gt;&lt;span&gt;  type: DriverFormFieldType.password,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;16&lt;/span&gt;&lt;span&gt;  label: &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;密码&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;.tr(context),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;17&lt;/span&gt;&lt;span&gt;  value: _option[&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;18&lt;/span&gt;&lt;span&gt;  onTap: (result) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;19&lt;/span&gt;&lt;span&gt;    setState(() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;20&lt;/span&gt;&lt;span&gt;      _option[&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;] &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;21&lt;/span&gt;&lt;span&gt;    });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;22&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;23&lt;/span&gt;&lt;span&gt;    widget.form.option &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; jsonEncode(_option);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;24&lt;/span&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;25&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;</content>
        <category term="Tech/Coding/Flutter"></category>
    </entry>
    <entry xml:lang="zh">
      <title>Snow静态博客处理多图排版</title>
      <link href="https://honmaple.me/posts/2023/12/snowjing-tai-bo-ke-chu-li-duo-tu-pai-ban/" rel="alternate"></link>
      <published>Sun, 17 Dec 2023 17:04:52 +0000</published>
      <updated>Sat, 11 Jul 2026 01:19:54 +0000</updated>
      <author>
        <name>honmaple</name>
      </author>
      <link rel="alternate" href="https://honmaple.me/posts/2023/12/snowjing-tai-bo-ke-chu-li-duo-tu-pai-ban/" type="text/html"/>
      <id>https://honmaple.me/posts/2023/12/snowjing-tai-bo-ke-chu-li-duo-tu-pai-ban/</id>
      <summary type="html">
&lt;p&gt;
事情的缘由是我无意中发现之前写的部分文章里的图片没有渲染出来，才想起之前博客系统改版，从 &lt;b&gt;Pelican&lt;/b&gt; 切换到 &lt;b&gt;Snow&lt;/b&gt; 时竟然忘记更新，看了一下原文，大部分都是以下形式
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;row&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;  &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;col-md-4&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;    [[https://s.libforest.com/images/pic/西湖/日落(二).jpg...&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;</summary>
      <content type="html">
&lt;p&gt;
事情的缘由是我无意中发现之前写的部分文章里的图片没有渲染出来，才想起之前博客系统改版，从 &lt;b&gt;Pelican&lt;/b&gt; 切换到 &lt;b&gt;Snow&lt;/b&gt; 时竟然忘记更新，看了一下原文，大部分都是以下形式
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;row&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;  &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;col-md-4&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;    [[https://s.libforest.com/images/pic/西湖/日落(二).jpg]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;  &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;col-md-4&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;    [[https://s.libforest.com/images/pic/西湖/日落(三).jpg]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;  &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;col-md-4&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;    [[https://s.libforest.com/images/pic/西湖/日落(一).jpg]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
因为我之前的博客主题使用了 &lt;b&gt;Bootstrap&lt;/b&gt;，为了能够让多张图片并排显示，所以用了 &lt;b&gt;Bootstrap&lt;/b&gt; 里的 &lt;code&gt;.row .col-*&lt;/code&gt;。但前不久移除了全部的 &lt;b&gt;Bootstrap&lt;/b&gt;，现在当然不会生效。另外一点是我之前用的 &lt;b&gt;org mode&lt;/b&gt; 解析器可以直接解析 &lt;b&gt;HTML&lt;/b&gt; 中的链接，但更换了新的解析器 &lt;a href=&quot;https://github.com/honmaple/org-golang&quot;&gt;org-golang&lt;/a&gt; 后，已经无法不能解析HTML中的原始链接
&lt;/p&gt;

&lt;p&gt;
此次利用 &lt;b&gt;Snow&lt;/b&gt; 博客系统中的 &lt;b&gt;shortcode&lt;/b&gt; 功能实现多图排版，让图片可以并排显示，多行显示。
&lt;/p&gt;

&lt;h2 id=&quot;heading-1&quot;&gt;解析原始链接&lt;/h2&gt;
&lt;p&gt;
   首先在主题下创建一个名为 &lt;code&gt;img-layout&lt;/code&gt; 的 &lt;b&gt;shortcode&lt;/b&gt;，比如我使用的主题叫做 &lt;b&gt;snow&lt;/b&gt;，所以在 &lt;code&gt;themes/snow/templates/shortcodes&lt;/code&gt; 目录下创建一个 &lt;code&gt;img-layout.html&lt;/code&gt; 文件，并添加 &lt;code&gt;markdown&lt;/code&gt; 或者 &lt;code&gt;org&lt;/code&gt; 的 &lt;b&gt;filter&lt;/b&gt; 将原始文本解析成HTML
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;img-layout&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  {%- if params.type == &amp;#34;markdown&amp;#34; %}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  {{ body | markdown | safe }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;  {%- else %}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;  {{ body | org | safe }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;  {%- endif %}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;7&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   接着修改原始文章
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;#+begin_export html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;&amp;lt;&lt;/span&gt;shortcode _name&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;img-layout&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;[[https:&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;s&lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;libforest&lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;com&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;images&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;pic&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;西&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;湖&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;日&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;落&lt;/span&gt;(&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;二&lt;/span&gt;)&lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;jpg]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;[[https:&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;s&lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;libforest&lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;com&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;images&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;pic&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;西&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;湖&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;日&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;落&lt;/span&gt;(&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;三&lt;/span&gt;)&lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;jpg]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;[[https:&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;s&lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;libforest&lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;com&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;images&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;pic&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;西&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;湖&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;日&lt;/span&gt;&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;落&lt;/span&gt;(&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;一&lt;/span&gt;)&lt;span style=&quot;color:#f92672&quot;&gt;.&lt;/span&gt;jpg]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt;shortcode&lt;span style=&quot;color:#f92672&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;7&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;#+end_export&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   经过修改，原始文章中的内容将会自动渲染成
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;img-layout&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;    &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;img&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;https://s.libforest.com/images/pic/西湖/日落(二).jpg&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;    &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;img&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;https://s.libforest.com/images/pic/西湖/日落(三).jpg&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;    &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;img&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;https://s.libforest.com/images/pic/西湖/日落(一).jpg&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;7&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h2 id=&quot;heading-2&quot;&gt;并排显示&lt;/h2&gt;
&lt;p&gt;
   有了固定结构的HTML， 接着就可以添加 &lt;b&gt;css&lt;/b&gt;，使多张图片可以并排显示
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 1&lt;/span&gt;&lt;span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;img-layout&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;p&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 2&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;display&lt;/span&gt;: &lt;span style=&quot;color:#66d9ef&quot;&gt;flex&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 3&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;flex-wrap&lt;/span&gt;: &lt;span style=&quot;color:#66d9ef&quot;&gt;wrap&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 4&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 5&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 6&lt;/span&gt;&lt;span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;img-layout&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;p&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;img&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 7&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;width&lt;/span&gt;: &lt;span style=&quot;color:#66d9ef&quot;&gt;auto&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 8&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;min-width&lt;/span&gt;: &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt; 9&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;max-width&lt;/span&gt;: &lt;span style=&quot;color:#ae81ff&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;10&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;11&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;flex&lt;/span&gt;: &lt;span style=&quot;color:#ae81ff&quot;&gt;10000&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;1&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;12&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;13&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;14&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;/* 处理手机等设备图片显示问题 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;15&lt;/span&gt;&lt;span&gt;@&lt;span style=&quot;color:#66d9ef&quot;&gt;media&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;screen&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;and&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;max-width&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;600px&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;)&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;16&lt;/span&gt;&lt;span&gt;    .&lt;span style=&quot;color:#a6e22e&quot;&gt;img-layout&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;p&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;img&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;17&lt;/span&gt;&lt;span&gt;        &lt;span style=&quot;color:#66d9ef&quot;&gt;min-width&lt;/span&gt;: &lt;span style=&quot;color:#ae81ff&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;18&lt;/span&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;19&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;20&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;21&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;/* 添加图片上下左右间隔 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;22&lt;/span&gt;&lt;span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;img-layout&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;p&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;23&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#ae81ff&quot;&gt;-0.25&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;rem&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;-0.25&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;rem&lt;/span&gt; &lt;span style=&quot;color:#75715e&quot;&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;24&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;25&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;26&lt;/span&gt;&lt;span&gt;.&lt;span style=&quot;color:#a6e22e&quot;&gt;img-layout&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;p&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;*&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;27&lt;/span&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;margin&lt;/span&gt;: &lt;span style=&quot;color:#ae81ff&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;rem&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0.25&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;rem&lt;/span&gt; &lt;span style=&quot;color:#75715e&quot;&gt;!important&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;28&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h2 id=&quot;heading-3&quot;&gt;多行显示&lt;/h2&gt;
&lt;p&gt;
   多行显示可以利用文件解析时每次遇到空行都会生成一个新的段落，比如
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;[[https://s.libforest.com/images/pic/西湖/日落(一).jpg]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;[[https://s.libforest.com/images/pic/西湖/日落(二).jpg]]&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
   就会生成
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;img&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;https://s.libforest.com/images/pic/西湖/日落(一).jpg&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;  &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;img&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;https://s.libforest.com/images/pic/西湖/日落(二).jpg&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;p&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
   故如果需要多行显示，只用在多张图片中间添加一个空行即可
&lt;/p&gt;

&lt;h2 id=&quot;heading-4&quot;&gt;图片懒加载和点击全屏&lt;/h2&gt;
&lt;p&gt;
   之前的图片懒加载和点击全屏的功能我也是利用 &lt;b&gt;Snow&lt;/b&gt; 中的 &lt;b&gt;shortcode&lt;/b&gt; 功能实现的，我在 &lt;code&gt;themes/snow/templates/shortcodes&lt;/code&gt; 目录下建立了一个 &lt;code&gt;img.html&lt;/code&gt; 的文件
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;a&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;{{ params.src }}&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;data-fancybox&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;image&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  &amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;img&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;data-src&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;{{ params.src + &amp;#39;-thumb&amp;#39; }}&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;lazyload&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;a&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
   这样，文章内所有的 &lt;code&gt;img&lt;/code&gt; 标签的图片都会加上懒加载和点击全屏的功能(基于 &lt;b&gt;lazysizes&lt;/b&gt; 和 &lt;b&gt;fancybox&lt;/b&gt;)
&lt;/p&gt;

&lt;p&gt;
   但是，由于 &lt;b&gt;Snow&lt;/b&gt; 中 &lt;b&gt;shortcode&lt;/b&gt; 的实现是一次性遍历 &lt;b&gt;HTML DOM&lt;/b&gt;，无法在一个 &lt;b&gt;shortcode&lt;/b&gt; 内部调用另一个 &lt;b&gt;shortcode&lt;/b&gt;。
   所幸 &lt;b&gt;Snow&lt;/b&gt; 是我自己写的，思索片刻，我在 &lt;b&gt;shortcode&lt;/b&gt; 实现中加入了三行代码，这样就能在一个 &lt;b&gt;shortcode&lt;/b&gt; 中重复调用其它的 &lt;b&gt;shortcode&lt;/b&gt;
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;vars := map[string]interface{}{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;+	&amp;#34;_shortcode&amp;#34;: func(s string) string {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;+		return self.shortcode(page, s)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;+	},
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   然后修改 &lt;code&gt;img-layout.html&lt;/code&gt;
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;img-layout&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;  {%- if params.type == &amp;#34;markdown&amp;#34; %}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;  {{ _shortcode(body | markdown) | safe }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;  {%- else %}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;  {{ _shortcode(body | org) | safe }}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;  {%- endif %}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;7&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span style=&quot;color:#f92672&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
   最后添加 &lt;b&gt;css&lt;/b&gt; 样式
&lt;/p&gt;
&lt;pre style=&quot;color:#f8f8f2;background-color:#272822;-webkit-text-size-adjust:none;&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;- .img-layout p &amp;gt; img {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;+ .img-layout p &amp;gt; img, .img-layout p &amp;gt; a {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;3&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;+ .img-layout p &amp;gt; a &amp;gt; img {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;+     height: 100%;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span style=&quot;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&quot;&gt;6&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color:#a6e22e&quot;&gt;+ }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h2 id=&quot;heading-5&quot;&gt;显示效果&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 一张图片
&lt;/p&gt;
&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/pic/西湖/日落(三).jpg-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/pic/西湖/日落(三).jpg-thumb&quot;
         alt=&quot;日落(三).jpg&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/libs/glightbox/glightbox.min.css&quot;&gt;
  &lt;script src=&quot;https://honmaple.me/libs/vanilla-lazyload/lazyload.min.js&quot; defer&gt;&lt;/script&gt;
  &lt;script src=&quot;https://honmaple.me/libs/glightbox/glightbox.min.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lazyload.js&quot; defer&gt;&lt;/script&gt;
    &lt;script src=&quot;https://honmaple.me/js/lightbox.js&quot; defer&gt;&lt;/script&gt;

&lt;/p&gt;

&lt;/div&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://honmaple.me/css/gallery.css&quot;&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 两张图片
&lt;/p&gt;
&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/pic/西湖/日落(三).jpg-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/pic/西湖/日落(三).jpg-thumb&quot;
         alt=&quot;日落(三).jpg&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/pic/西湖/日落(一).jpg-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/pic/西湖/日落(一).jpg-thumb&quot;
         alt=&quot;日落(一).jpg&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 三张图片
&lt;/p&gt;
&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/pic/西湖/日落(二).jpg-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/pic/西湖/日落(二).jpg-thumb&quot;
         alt=&quot;日落(二).jpg&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/pic/西湖/日落(三).jpg-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/pic/西湖/日落(三).jpg-thumb&quot;
         alt=&quot;日落(三).jpg&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/pic/西湖/日落(一).jpg-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/pic/西湖/日落(一).jpg-thumb&quot;
         alt=&quot;日落(一).jpg&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
 多行显示
&lt;/p&gt;
&lt;div class=&quot;gallery gallery-grid&quot;&gt;
  
&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/pic/西湖/日落(二).jpg-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/pic/西湖/日落(二).jpg-thumb&quot;
         alt=&quot;日落(二).jpg&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/pic/西湖/日落(三).jpg-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/pic/西湖/日落(三).jpg-thumb&quot;
         alt=&quot;日落(三).jpg&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;
     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/pic/西湖/日落(一).jpg-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/pic/西湖/日落(一).jpg-thumb&quot;
         alt=&quot;日落(一).jpg&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/pic/西湖/日落(二).jpg-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/pic/西湖/日落(二).jpg-thumb&quot;
         alt=&quot;日落(二).jpg&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

     
  &lt;a class=&quot;mx-auto block w-fit max-w-full no-underline&quot; href=&quot;https://s.libforest.com/images/pic/西湖/日落(三).jpg-show&quot; data-img-lightbox data-gallery=&quot;page-images&quot; data-type=&quot;image&quot;&gt;
    &lt;img data-src=&quot;https://s.libforest.com/images/pic/西湖/日落(三).jpg-thumb&quot;
         alt=&quot;日落(三).jpg&quot;
         decoding=&quot;async&quot;
         class=&quot;lazy mx-auto cursor-zoom-in rounded-md &quot;&gt;
  &lt;/a&gt;

&lt;/p&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;heading-6&quot;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
 &lt;a href=&quot;https://immmmm.com/about-images-gird/&quot;&gt;https://immmmm.com/about-images-gird/&lt;/a&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
        <category term="Tech"></category>
    </entry>
</feed>
