647 lines
491 KiB
HTML
647 lines
491 KiB
HTML
|
<!DOCTYPE html>
|
|||
|
<html lang="zh"><head><title>项目计划书</title><meta charset="utf-8"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM Plex Mono&family=Noto Serif Simplified Chinese:wght@400;700&family=Source Sans Pro:ital,wght@0,400;0,600;1,400;1,600&display=swap"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta property="og:title" content="项目计划书"/><meta property="og:description" content="《穹顶之下》(RSSky)项目旨在通过建立一个开放的RSS平台,打破信息茧房,提供多元化的信息获取渠道,并通过社区协作管理和代理RSS资源,实现信息的自由流通和高效订阅。."/><meta property="og:image" content="https://wiki.7wate.com/static/og-image.png"/><meta property="og:width" content="1200"/><meta property="og:height" content="675"/><link rel="icon" href="../../../static/icon.png"/><meta name="description" content="《穹顶之下》(RSSky)项目旨在通过建立一个开放的RSS平台,打破信息茧房,提供多元化的信息获取渠道,并通过社区协作管理和代理RSS资源,实现信息的自由流通和高效订阅。."/><meta name="generator" content="Quartz"/><link href="../../../index.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.css" rel="stylesheet" type="text/css" spa-preserve/><script src="../../../prescript.js" type="application/javascript" spa-preserve></script><script type="application/javascript" spa-preserve>const fetchData = fetch("../../../static/contentIndex.json").then(data => data.json())</script></head><body data-slug="Professional/Project/RSSky/项目计划书"><div id="quartz-root" class="page"><div id="quartz-body"><div class="left sidebar"><h2 class="page-title"><a href="../../..">🪴 X·Eden</a></h2><div class="spacer mobile-only"></div><div class="search"><button class="search-button" id="search-button"><p>搜索</p><svg role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.9 19.7"><title>Search</title><g class="search-path" fill="none"><path stroke-linecap="square" d="M18.5 18.3l-5.4-5.4"></path><circle cx="8" cy="8" r="7"></circle></g></svg></button><div id="search-container"><div id="search-space"><input autocomplete="off" id="search-bar" name="search" type="text" aria-label="搜索些什么" placeholder="搜索些什么"/><div id="search-layout" data-preview="true"></div></div></div></div><button class="darkmode" id="darkmode"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="dayIcon" x="0px" y="0px" viewBox="0 0 35 35" style="enable-background:new 0 0 35 35" xml:space="preserve" aria-label="暗色模式"><title>暗色模式</title><path d="M6,17.5C6,16.672,5.328,16,4.5,16h-3C0.672,16,0,16.672,0,17.5 S0.672,19,1.5,19h3C5.328,19,6,18.328,6,17.5z M7.5,26c-0.414,0-0.789,0.168-1.061,0.439l-2,2C4.168,28.711,4,29.086,4,29.5 C4,30.328,4.671,31,5.5,31c0.414,0,0.789-0.168,1.06-0.44l2-2C8.832,28.289,9,27.914,9,27.5C9,26.672,8.329,26,7.5,26z M17.5,6 C18.329,6,19,5.328,19,4.5v-3C19,0.672,18.329,0,17.5,0S16,0.672,16,1.5v3C16,5.328,16.671,6,17.5,6z M27.5,9 c0.414,0,0.789-0.168,1.06-0.439l2-2C30.832,6.289,31,5.914,31,5.5C31,4.672,30.329,4,29.5,4c-0.414,0-0.789,0.168-1.061,0.44 l-2,2C26.168,6.711,26,7.086,26,7.5C26,8.328,26.671,9,27.5,9z M6.439,8.561C6.711,8.832,7.086,9,7.5,9C8.328,9,9,8.328,9,7.5 c0-0.414-0.168-0.789-0.439-1.061l-2-2C6.289,4.168,5.914,4,5.5,4C4.672,4,4,4.672,4,5.5c0,0.414,0.168,0.789,0.439,1.06 L6.439,8.561z M33.5,16h-3c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5h3c0.828,0,1.5-0.672,1.5-1.5S34.328,16,33.5,16z M28.561,26.439C28.289,26.168,27.914,26,27.5,26c-0.828,0-1.5,0.672-1.5,1.5c0,0.414,0.168,0.789,0.439,1.06l2,2 C28.711,30.832,29.086,31,29.5,31c0.828,0,1.5-0.672,1.5-1.5c0-0.414-0.168-0.789-0.439-1.061L28.561,26.439z M17.5,29 c-0.829,0-1.5,0.672-1.5,1.5v3c0,0.828,
|
|||
|
<h3 id="11-项目背景">1.1 项目背景<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#11-项目背景" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<p>在信息爆炸的时代,互联网用户面对海量信息时,常常陷入<strong>信息茧房</strong>。这一现象指的是,用户的接收信息渠道受到算法推荐的限制,导致其只能接触到与自己兴趣、观点一致的信息,从而失去了多元视角。这不仅影响了个人的全面认知,也限制了社会整体的多样化对话。</p>
|
|||
|
<p>《穹顶之下》项目(RSSky)旨在通过为用户提供多维度的信息获取渠道,打破信息茧房,提升信息获取的质量和效率。RSSky 的核心理念是建立一个开放、透明、自由的信息获取平台,依托 RSS 技术和社区协作,为用户带来高质量、全面的内容订阅服务。</p>
|
|||
|
<h3 id="12-项目愿景">1.2 项目愿景<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#12-项目愿景" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<p><strong>愿景</strong>:打破信息茧房,提供多元信息获取渠道,提升用户对世界的理解和信息辨别能力。通过社区协作,提供开放、透明、自由的 RSS 资源代理与管理服务。</p>
|
|||
|
<h2 id="2-项目概述">2. 项目概述<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#2-项目概述" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
|||
|
<h3 id="21-项目目标">2.1 项目目标<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#21-项目目标" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<blockquote>
|
|||
|
<p>无限可能,为自由而生</p>
|
|||
|
</blockquote>
|
|||
|
<p><strong>《穹顶之下》(RSSky)</strong> 的主要目标是为用户提供高质量的 RSS 订阅资源,并通过开源社区协作管理和代理这些资源,确保信息获取的稳定性和高效性。具体目标包括:</p>
|
|||
|
<ol>
|
|||
|
<li><strong>信息开放</strong>:打破信息茧房,提供多元化、全面的信息获取渠道。</li>
|
|||
|
<li><strong>社区协作</strong>:通过社区成员共同贡献和管理 RSS 资源,实现分布式、协作式的信息提供。</li>
|
|||
|
<li><strong>自动化管理</strong>:使用自动化技术实现 RSS 资源的更新、验证、路由与缓存管理,确保数据的实时性和稳定性。</li>
|
|||
|
<li><strong>用户需求满足</strong>:支持个性化需求定制,帮助用户根据兴趣选择、管理和获取内容。</li>
|
|||
|
</ol>
|
|||
|
<h3 id="22-阶段性目标">2.2 阶段性目标<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#22-阶段性目标" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<ul>
|
|||
|
<li><strong>阶段一</strong>:完成社区平台的搭建,实现 100 个高质量的 RSS 资源代理,并通过 Cloudflare Workers 进行路由管理。</li>
|
|||
|
<li><strong>阶段二</strong>:扩展到 100 名活跃用户,代理 1000 个 RSS 资源,并支持用户需求定制,优化路由系统性能。</li>
|
|||
|
</ul>
|
|||
|
<h2 id="3-技术方案">3. 技术方案<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#3-技术方案" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
|||
|
<h3 id="31-总体架构设计">3.1 总体架构设计<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#31-总体架构设计" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<p>RSSky 的核心是 <strong>RSS 资源代理与路由管理</strong>,它通过社区协作者提交的 RSS 资源地址,社区仓库对这些资源进行代理和缓存,所有的爬虫及 RSS 生成工作由协作者独立完成,<strong>社区负责数据的流通与路由映射管理。</strong></p>
|
|||
|
<p>架构核心模块包括:</p>
|
|||
|
<ul>
|
|||
|
<li><strong>Cloudflare Workers</strong>:用于代理和缓存 RSS 请求。</li>
|
|||
|
<li><strong>社区 GitHub 仓库</strong>:用于管理 RSS 路由映射和自动化任务。</li>
|
|||
|
<li><strong>协作者独立爬虫</strong>:由社区协作者独立运行爬虫,生成 RSS 资源。</li>
|
|||
|
</ul>
|
|||
|
<h4 id="311-核心架构图">3.1.1 核心架构图<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#311-核心架构图" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
|||
|
<pre><code class="mermaid">graph TD;
|
|||
|
subgraph Community GitHub Repository ["Community GitHub Repository"]
|
|||
|
B1[PR: Collaborator submits new RSS feed URL]
|
|||
|
B2[GitHub Actions: Validate RSS feed URL]
|
|||
|
B3[GitHub Actions: Merge PR and update mappings]
|
|||
|
end
|
|||
|
|
|||
|
subgraph Cloudflare Workers ["Cloudflare Workers"]
|
|||
|
A1[Handles routing requests]
|
|||
|
A2[Caches RSS feed responses]
|
|||
|
A3[Proxies requests to RSS providers]
|
|||
|
end
|
|||
|
|
|||
|
subgraph Collaborator RSS Providers ["Collaborator RSS Providers"]
|
|||
|
C1[Collaborator's crawler generates RSS XML]
|
|||
|
C2[RSS XML file hosted on collaborator's server]
|
|||
|
end
|
|||
|
|
|||
|
subgraph Users ["Users"]
|
|||
|
D1[User requests RSS feed]
|
|||
|
D2[Receives RSS feed response]
|
|||
|
end
|
|||
|
|
|||
|
B1 --> B2 --> B3
|
|||
|
B3 --> A1
|
|||
|
A1 --> A2
|
|||
|
A1 --> A3
|
|||
|
A3 --> C2
|
|||
|
C1 --> C2
|
|||
|
A2 --> D2
|
|||
|
D1 --> A1
|
|||
|
</code></pre>
|
|||
|
<h4 id="312-核心流程图">3.1.2 核心流程图<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#312-核心流程图" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
|||
|
<pre><code class="mermaid">sequenceDiagram
|
|||
|
participant Collaborator as 协作者
|
|||
|
participant GitHub as GitHub Repository
|
|||
|
participant GitHubActions as GitHub Actions
|
|||
|
participant Cloudflare as Cloudflare Workers
|
|||
|
participant Cache as Cache
|
|||
|
participant CollaboratorServer as 协作者服务器
|
|||
|
participant User as 用户
|
|||
|
|
|||
|
用户请求和处理流程
|
|||
|
User->>Cloudflare: 请求 RSS 源 (代理地址)
|
|||
|
Cloudflare->>Cache: 检查缓存是否存在
|
|||
|
alt 缓存命中
|
|||
|
Cache-->>Cloudflare: 返回缓存的 RSS 文件
|
|||
|
Cloudflare-->>User: 返回缓存的 RSS 文件
|
|||
|
else 缓存未命中
|
|||
|
Cloudflare->>CollaboratorServer: 请求协作者服务器获取最新 RSS 文件
|
|||
|
CollaboratorServer-->>Cloudflare: 返回最新的 RSS 文件
|
|||
|
Cloudflare->>Cache: 缓存新的 RSS 文件
|
|||
|
Cloudflare-->>User: 返回最新的 RSS 文件
|
|||
|
end
|
|||
|
</code></pre>
|
|||
|
<h4 id="313-核心功能模块">3.1.3 核心功能模块<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#313-核心功能模块" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
|||
|
<h5 id="cloudflare-workers-路由管理">Cloudflare Workers 路由管理<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#cloudflare-workers-路由管理" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h5>
|
|||
|
<p><strong>Cloudflare Workers</strong> 是整个系统的核心代理模块,负责处理所有用户的 RSS 资源请求,并代理协作者提供的真实 RSS 地址。</p>
|
|||
|
<pre><code class="mermaid">sequenceDiagram
|
|||
|
participant User as 用户
|
|||
|
participant Cloudflare as Cloudflare Workers
|
|||
|
participant Cache as Workers 缓存
|
|||
|
participant CollaboratorServer as 协作者服务器
|
|||
|
|
|||
|
User->>Cloudflare: 请求代理 RSS 地址
|
|||
|
Cloudflare->>Cache: 检查 RSS 是否已缓存
|
|||
|
alt 缓存命中
|
|||
|
Cache-->>Cloudflare: 返回缓存的 RSS 文件
|
|||
|
Cloudflare-->>User: 返回 RSS 文件
|
|||
|
else 缓存未命中
|
|||
|
Cloudflare->>CollaboratorServer: 请求协作者服务器获取最新 RSS 文件
|
|||
|
CollaboratorServer-->>Cloudflare: 返回最新 RSS 文件
|
|||
|
Cloudflare->>Cache: 缓存新的 RSS 文件
|
|||
|
Cloudflare-->>User: 返回最新的 RSS 文件
|
|||
|
end
|
|||
|
</code></pre>
|
|||
|
<p>它的主要职责包括:</p>
|
|||
|
<ol>
|
|||
|
<li><strong>处理路由请求</strong>:
|
|||
|
<ul>
|
|||
|
<li>Cloudflare Workers 接收用户请求并通过路由映射找到相应的 RSS 资源地址。</li>
|
|||
|
<li>当用户访问代理的 RSS 地址时,Cloudflare Workers 负责转发请求并获取真实的 RSS 资源。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>缓存管理</strong>:
|
|||
|
<ul>
|
|||
|
<li>为提高效率,Cloudflare Workers 会将已请求的 RSS 文件进行缓存,下一次请求同样的资源时,直接从缓存中返回结果。</li>
|
|||
|
<li>缓存策略会根据 RSS 内容的更新频率进行动态调整,确保用户始终获取最新的 RSS 信息。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>代理与负载均衡</strong>:
|
|||
|
<ul>
|
|||
|
<li>当缓存失效或 RSS 源地址不可访问时,Cloudflare Workers 通过代理访问协作者服务器以获取最新 RSS 文件。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h5 id="社区-github-仓库">社区 GitHub 仓库<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#社区-github-仓库" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h5>
|
|||
|
<p>社区 GitHub 仓库作为系统的核心协作平台,管理所有 RSS 资源的路由映射文件及更新。每一个 RSS 资源由社区成员通过 PR 提交。</p>
|
|||
|
<pre><code class="mermaid">sequenceDiagram
|
|||
|
participant Collaborator as 协作者
|
|||
|
participant GitHub as GitHub Repository
|
|||
|
participant GitHubActions as GitHub Actions
|
|||
|
participant Cloudflare as Cloudflare Workers
|
|||
|
|
|||
|
Collaborator->>GitHub: 提交 PR (新 RSS 源/更新源)
|
|||
|
GitHub-->>GitHubActions: 触发 GitHub Actions
|
|||
|
GitHubActions->>GitHubActions: 验证 RSS 源(可访问性、格式正确性)
|
|||
|
GitHubActions-->>Collaborator: 验证通过/失败反馈
|
|||
|
GitHubActions->>GitHub: 合并 PR
|
|||
|
GitHubActions->>Cloudflare: 更新 Cloudflare Workers 路由映射
|
|||
|
</code></pre>
|
|||
|
<p>社区具体功能包括:</p>
|
|||
|
<ol>
|
|||
|
<li><strong>PR 提交与验证</strong>:
|
|||
|
<ul>
|
|||
|
<li>协作者可以通过 GitHub PR 提交新的 RSS 资源地址或更新已有的地址。</li>
|
|||
|
<li>GitHub Actions 自动触发对 RSS 资源的验证,确保提交的地址能够正常访问,并且格式正确。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>自动化管理</strong>:
|
|||
|
<ul>
|
|||
|
<li>验证通过后,GitHub Actions 会自动合并 PR 并更新路由映射文件。这些映射文件由 Cloudflare Workers 使用,确保用户请求能够正确路由到真实的 RSS 地址。</li>
|
|||
|
<li>GitHub Actions 定期执行健康检查,验证现有 RSS 资源的可用性,若发现失效资源,将通知相关贡献者修复或删除。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>社区协作与贡献激励</strong>:
|
|||
|
<ul>
|
|||
|
<li>社区成员通过贡献 RSS 资源或修复现有问题,提升社区的活跃度。GitHub 仓库提供公开的贡献历史,社区可以通过排行榜、积分等机制激励成员贡献。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h5 id="协作者独立爬虫">协作者独立爬虫<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#协作者独立爬虫" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h5>
|
|||
|
<p>协作者独立爬虫是系统的基础数据来源,由各个社区贡献者负责编写、维护并托管。</p>
|
|||
|
<pre><code class="mermaid">sequenceDiagram
|
|||
|
participant Collaborator as 协作者
|
|||
|
participant Crawler as 爬虫脚本
|
|||
|
participant CollaboratorServer as 协作者服务器
|
|||
|
participant GitHub as GitHub Repository
|
|||
|
participant GitHubActions as GitHub Actions
|
|||
|
|
|||
|
Collaborator->>Crawler: 定期运行爬虫抓取数据
|
|||
|
Crawler->>CollaboratorServer: 生成 RSS 文件并托管
|
|||
|
Collaborator->>GitHub: 提交新的 RSS 地址/更新地址至 GitHub
|
|||
|
GitHub-->>GitHubActions: 触发自动化验证
|
|||
|
GitHubActions->>GitHubActions: 验证 RSS 文件并更新映射
|
|||
|
</code></pre>
|
|||
|
<p>其主要功能和责任如下:</p>
|
|||
|
<ol>
|
|||
|
<li><strong>RSS 生成与托管</strong>:
|
|||
|
<ul>
|
|||
|
<li>协作者可以使用任意编程语言编写爬虫,负责抓取目标网站的内容并生成 RSS 文件。每个协作者独立运行自己的爬虫,系统不会集中管理爬虫任务。</li>
|
|||
|
<li>生成的 RSS 文件由协作者服务器托管,协作者需要定期维护爬虫,确保 RSS 文件的时效性。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>自动化生成与更新</strong>:
|
|||
|
<ul>
|
|||
|
<li>协作者可以通过 GitHub Actions 或其他定时任务自动生成和更新 RSS 文件。例如,协作者可以设置每天定时运行爬虫,抓取最新的内容并更新 RSS 文件。</li>
|
|||
|
<li>RSS 文件生成后,协作者将地址提交至社区 GitHub 仓库,系统自动更新对应的路由映射。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>灵活性与兼容性</strong>:
|
|||
|
<ul>
|
|||
|
<li>系统允许协作者使用多种语言编写爬虫,例如 Python、Node.js 或 Rust 等。不同协作者可以根据自己熟悉的开发环境选择合适的技术栈,提升社区贡献的灵活性。</li>
|
|||
|
<li>为确保统一标准,建议社区提供爬虫编写的模板和代码规范,确保不同语言编写的爬虫都能顺利集成到系统中。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="32-技术选型">3.2 技术选型<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#32-技术选型" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<ol>
|
|||
|
<li><strong>语言与开发工具</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>JavaScript</strong>:用于编写 Cloudflare Workers 路由逻辑。</li>
|
|||
|
<li><strong>Python、Node.js、Rust</strong>:协作者可以自行选择开发 RSS 爬虫的语言,<strong>项目不限制爬虫开发语言。</strong></li>
|
|||
|
<li><strong>GitHub Actions</strong>:用于处理自动化任务,如提交的 RSS 资源验证、合并、定期更新等。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>数据库与存储</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>GitHub 仓库</strong>:社区不直接存储 RSS 数据,仅存储 URL 映射文件,数据存储由提供者决定。</li>
|
|||
|
<li><strong>缓存机制</strong>:Cloudflare Workers 通过缓存管理 RSS 资源,确保访问效率。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>代理与路由管理</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>Cloudflare Workers</strong>:用于动态代理协作者提供的 RSS 资源。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="33-核心功能实现">3.3 核心功能实现<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#33-核心功能实现" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<p>项目的核心功能围绕<strong>自动化工作流</strong>、<strong>用户界面与订阅管理</strong>、以及<strong>健康监控与通知</strong>展开。这些功能不仅确保 RSS 资源的自动更新和管理,还提供了一种用户友好的交互方式,以便轻松管理和订阅内容。</p>
|
|||
|
<h4 id="331-自动化工作流">3.3.1 自动化工作流<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#331-自动化工作流" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
|||
|
<p><strong>GitHub Actions</strong> 在整个项目中扮演了自动化管理的关键角色,通过其强大的 CI/CD 流程,协作者提交的 RSS 资源能够得到快速验证、自动化处理和更新。自动化工作流的几个关键部分包括:</p>
|
|||
|
<ol>
|
|||
|
<li><strong>PR 提交与自动化处理</strong>:
|
|||
|
<ul>
|
|||
|
<li>当协作者提交新的 RSS 资源或更新现有资源时,GitHub Actions 会自动触发,进行以下步骤:
|
|||
|
<ul>
|
|||
|
<li>验证提交的 RSS URL 是否能够正常访问。</li>
|
|||
|
<li>检查 RSS 源的内容格式是否正确。</li>
|
|||
|
<li>验证通过后,自动合并 PR 到主仓库。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li>如果验证失败,GitHub Actions 会通过评论通知提交者,并提供失败原因及修复建议。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>自动化健康监控</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>定期任务</strong>:GitHub Actions 通过定期执行的任务,检查所有已代理的 RSS 资源的可用性。确保每个资源能够在特定时间窗口内正常访问。</li>
|
|||
|
<li><strong>自动修复</strong>:当某个 RSS 资源无法访问时,GitHub Actions 可以通知协作者修复或更新资源。如果资源未能在规定时间内恢复,系统将自动标记为失效,并建议用户切换到备用资源。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>版本管理与发布</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>自动化版本发布</strong>:每周发布新版本,包含所有新提交的 RSS 资源及改进。每日生成体验版本,用于测试和持续改进系统功能。</li>
|
|||
|
<li><strong>GitHub Releases</strong>:每个稳定版本会自动发布到 GitHub Releases,社区开发者和用户可以获取最新的资源映射和路由信息。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h4 id="332-用户界面与订阅管理">3.3.2 用户界面与订阅管理<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#332-用户界面与订阅管理" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
|||
|
<p>项目通过<strong>基于 Markdown 文件</strong>来构建一个用户友好的静态站点界面,帮助用户轻松管理和订阅 RSS 资源。静态站点的优点是结构简单、维护方便、性能优越,并且可以与 GitHub Pages 无缝集成。以下是核心功能模块的详细说明:</p>
|
|||
|
<ol>
|
|||
|
<li><strong>基于 Markdown 的静态站点</strong>:
|
|||
|
<ul>
|
|||
|
<li>使用静态站点生成器基于 Markdown 文件构建一个简单直观的 Web 界面。每个 RSS 源都有一个对应的内容,文件中包含 RSS 源的详细信息、使用说明、订阅地址等。</li>
|
|||
|
<li>该静态站点将托管在 GitHub Pages 上,用户可以直接访问,并通过搜索或分类功能查找感兴趣的订阅源。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>订阅管理与搜索功能</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>搜索功能</strong>:用户可以通过站点内置的搜索引擎(如 Lunr.js 或 Algolia)搜索 RSS 资源。关键词搜索能够快速找到符合条件的 RSS 订阅源,极大提高了用户查找效率。</li>
|
|||
|
<li><strong>分类展示</strong>:每个 RSS 资源根据类别(如新闻、科技、娱乐等)进行分类展示,用户可以通过分类标签快速找到自己感兴趣的资源。每个分类页面使用 Markdown 文件生成,简单明了,方便用户浏览。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>个性化推荐与管理</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>RSS 管理面板</strong>:为用户提供简单的订阅管理面板,用户可以收藏、标记或取消订阅 RSS 源。管理面板将依靠客户端存储(如 LocalStorage)保持用户偏好,便于浏览器持久化用户的订阅记录。</li>
|
|||
|
<li><strong>一键订阅</strong>:每个 RSS 资源都提供一键复制订阅地址功能,用户可以快速将订阅地址复制并粘贴到其 RSS 阅读器中。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>RSS 资源展示与说明</strong>:
|
|||
|
<ul>
|
|||
|
<li>每个 RSS 资源的详细页面包含资源的介绍、更新频率、内容预览、订阅地址等详细信息。</li>
|
|||
|
<li>通过模板化 Markdown 文件生成资源页面,确保所有 RSS 源的展示信息一致且规范。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h4 id="333-健康监控与通知">3.3.3 健康监控与通知<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#333-健康监控与通知" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
|||
|
<p>系统通过<strong>自动化健康监控机制</strong>确保所有代理的 RSS 源在服务期间始终可用,并提供多层次的通知机制以便及时处理出现的任何问题。以下是功能模块的详细说明:</p>
|
|||
|
<ol>
|
|||
|
<li><strong>自动化健康检查</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>定期任务</strong>:通过 GitHub Actions 定期执行健康检查任务,验证所有 RSS 资源的可访问性和格式是否正确。</li>
|
|||
|
<li><strong>内容验证</strong>:检查每个 RSS 文件是否符合标准格式,如 <code><channel></code>, <code><item></code> 等必要的标签。确保 RSS 资源可以正常解析和使用。</li>
|
|||
|
<li><strong>更新频率检测</strong>:通过分析 RSS 源中的 <code><pubDate></code> 或 <code><lastBuildDate></code>,检测资源是否定期更新。对于长时间未更新的资源,标记为需要维护或替换。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>问题通知与修复建议</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>协作者通知</strong>:当发现某个 RSS 源失效时,系统会通过 GitHub Issues 自动生成问题报告,并通知协作者进行修复。协作者会收到问题的详细说明,包括失效原因和修复建议。</li>
|
|||
|
<li><strong>邮件与推送通知</strong>:协作者还会收到邮件通知或推送消息,确保他们能够及时修复问题,维持资源的可用性。</li>
|
|||
|
<li><strong>问题报告</strong>:所有检测结果会生成报告,并记录在 GitHub 中,便于社区成员审查和后续维护。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>备用资源支持</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>备用源配置</strong>:为一些重要或高访问量的 RSS 资源设置备用源,确保在主 RSS 资源失效时,系统可以自动切换到备用资源。</li>
|
|||
|
<li><strong>自动切换</strong>:当健康检查发现主源失效时,系统会自动启用备用源,保障服务的连续性。用户无需任何手动操作,系统会自动处理切换。</li>
|
|||
|
<li><strong>备用源管理</strong>:协作者可以通过提交 PR 方式更新或增加备用 RSS 源,确保资源在出现问题时能够顺利切换。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>用户反馈与问题报告</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>用户通知</strong>:当系统切换到备用资源时,用户将收到简要的通知,告知当前资源的状况。用户可以在资源页面查看详细信息,并选择是否手动更新订阅。</li>
|
|||
|
<li><strong>问题反馈渠道</strong>:用户可以通过静态站点的反馈功能报告失效的 RSS 资源。提交的反馈会转化为 GitHub Issues,供协作者查看并处理。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h4 id="334-社区协作与贡献者管理">3.3.4 社区协作与贡献者管理<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#334-社区协作与贡献者管理" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
|||
|
<p>社区协作是 RSSky 项目的基础,协作者通过贡献 RSS 资源并不断完善系统,维持项目的高活跃度。为了确保项目长期健康发展,系统提供了一套协作和管理机制,帮助社区成员更高效地参与项目。</p>
|
|||
|
<ol>
|
|||
|
<li><strong>贡献者管理与激励机制</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>贡献者排行榜</strong>:每个贡献者的贡献(包括提交的 RSS 源、修复的问题等)都会被记录,并根据贡献量进行积分评定。贡献者可以通过排行榜查看自己的排名,激励社区成员更加积极地参与。</li>
|
|||
|
<li><strong>贡献奖励与徽章系统</strong>:为激励活跃的贡献者,项目引入了社区徽章和奖励系统。核心贡献者可以获得“活跃贡献者”、“修复专家”等徽章,这些徽章会展示在贡献者的 GitHub 个人资料上,增加社区声望。</li>
|
|||
|
<li><strong>长期贡献者的社区影响力</strong>:核心贡献者可以被邀请参与项目的长期规划,帮助制定新功能的路线图,并参与项目的重大决策,进一步增强社区归属感。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>贡献者协作流程</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>GitHub PR 审核流程</strong>:贡献者通过 PR 向项目提交新功能或 RSS 资源。系统通过 GitHub Actions 自动验证 PR 的正确性(如 RSS URL 的有效性、内容格式的正确性等)。社区维护者或管理员在自动验证通过后,可以进一步进行手动审查和合并。</li>
|
|||
|
<li><strong>社区反馈与讨论</strong>:贡献者提交的 PR 可以通过 GitHub Discussions 或 Issues 进行社区讨论,确保提交的功能或 RSS 资源符合社区共识。这种开源协作的模式可以确保所有变更都能被详细审查和讨论。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>协作模板与文档支持</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>贡献指南</strong>:为协作者提供详细的贡献指南,帮助新加入的贡献者快速上手。指南中包含如何提交 PR、如何编写 RSS 源格式、以及如何通过 GitHub Actions 进行自动化测试等。</li>
|
|||
|
<li><strong>模板与代码规范</strong>:为确保不同贡献者提交的代码和 RSS 源符合统一标准,项目提供了模板和代码规范文档。所有贡献者在提交代码或 RSS 源之前,需要使用这些模板和规范进行检查,确保代码的可维护性和一致性。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>定期社区活动与黑客松</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>社区黑客松</strong>:项目可以定期组织在线黑客松活动,邀请全球开发者参与,推动新功能的开发和讨论。黑客松不仅能够激发创新,也能为项目引入更多新贡献者。</li>
|
|||
|
<li><strong>反馈与路线图讨论</strong>:项目管理员可以定期发起社区讨论,听取社区成员的意见和建议,并根据讨论结果调整未来的开发路线图。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="34-项目路线图">3.4 项目路线图<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#34-项目路线图" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<h4 id="341-短期目标0-6-个月">3.4.1 短期目标(0-6 个月)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#341-短期目标0-6-个月" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
|||
|
<ul>
|
|||
|
<li>实现基础的 RSS 资源代理和路由管理功能,使用 Cloudflare Workers 处理 RSS 资源请求。</li>
|
|||
|
<li>吸引社区成员贡献 RSS 资源,完善 PR 流程,实现自动化更新和验证。</li>
|
|||
|
<li>提供用户订阅管理的基本 Web 界面,支持一键订阅和管理功能。</li>
|
|||
|
</ul>
|
|||
|
<p>以帮助项目更好地监控和追踪进展。</p>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<div class="table-container"><table><thead><tr><th>主任务</th><th>子任务</th><th>状态</th></tr></thead><tbody><tr><td><strong>完成基础 RSS 资源代理与路由管理</strong></td><td>构建 Cloudflare Workers 路由逻辑</td><td></td></tr><tr><td></td><td>实现 RSS URL 到真实源地址的路由映射</td><td></td></tr><tr><td></td><td>实现基本缓存管理机制(支持频繁更新的 RSS 缓存刷新)</td><td></td></tr><tr><td></td><td>配置负载均衡机制,处理高并发 RSS 请求</td><td></td></tr><tr><td></td><td>创建基础状态页面,展示路由和缓存状态</td><td></td></tr><tr><td><strong>实现自动化工作流与 PR 管理</strong></td><td>集成 GitHub Actions,自动触发 PR 检查</td><td></td></tr><tr><td></td><td>编写 PR 验证脚本,检查 RSS 源可用性和格式</td><td></td></tr><tr><td></td><td>自动合并通过验证的 PR,更新路由映射</td><td></td></tr><tr><td></td><td>创建状态页面,展示 PR 提交、验证、合并的实时状态</td><td></td></tr><tr><td><strong>搭建用户界面与订阅管理</strong></td><td>使用 Hugo 或 Jekyll 构建静态站点</td><td></td></tr><tr><td></td><td>创建 RSS 源详细页面(包含订阅地址、说明)</td><td></td></tr><tr><td></td><td>集成 Lunr.js 或 Algolia 搜索引擎,支持 RSS 源关键词搜索</td><td></td></tr><tr><td></td><td>按类别展示 RSS 源,提供分类筛选功能</td><td></td></tr><tr><td></td><td>为每个 RSS 源创建一键复制订阅地址的功能</td><td></td></tr><tr><td></td><td>创建状态页面,展示站点更新和页面访问数据</td><td></td></tr><tr><td><strong>吸引社区协作者贡献 RSS 资源</strong></td><td>编写贡献指南,详细描述如何编写爬虫和提交 RSS 源</td><td></td></tr><tr><td></td><td>提供爬虫模板,支持多种语言(Python、Node.js、Rust)</td><td></td></tr><tr><td></td><td>开展社区推广活动,通过开发者论坛和社交媒体吸引贡献者</td><td></td></tr><tr><td></td><td>设置贡献排行榜,展示贡献者提交的 RSS 源和参与度</td><td></td></tr><tr><td></td><td>创建状态页面,展示社区成员贡献的统计数据</td><td></td></tr></tbody></table></div>
|
|||
|
<h4 id="342-中期目标6-12-个月">3.4.2 中期目标(6-12 个月)<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#342-中期目标6-12-个月" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h4>
|
|||
|
<ul>
|
|||
|
<li>扩展到 1000 个高质量的 RSS 订阅源,优化路由管理功能,提升系统的稳定性和性能。</li>
|
|||
|
<li>引入个性化推荐功能,通过分析用户的订阅历史,为用户提供更多相关 RSS 资源推荐。</li>
|
|||
|
<li>完善用户界面,增加 RSS 资源的可视化管理和分类功能,帮助用户更好地管理信息。</li>
|
|||
|
</ul>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<div class="table-container"><table><thead><tr><th>主任务</th><th>子任务</th></tr></thead><tbody><tr><td><strong>扩展 RSS 资源与优化缓存策略</strong></td><td>扩展至 1000 个高质量的 RSS 资源</td></tr><tr><td></td><td>为不同类型的 RSS 源优化缓存策略(高频、低频源不同缓存时间)</td></tr><tr><td></td><td>对路由映射进行优化,减少处理时间</td></tr><tr><td></td><td>设置缓存刷新状态页面,实时展示缓存命中率和缓存刷新周期</td></tr><tr><td><strong>开发个性化推荐功能</strong></td><td>通过分析用户订阅历史,开发个性化 RSS 源推荐算法</td></tr><tr><td></td><td>在用户界面增加推荐模块,提供相关推荐 RSS 源</td></tr><tr><td></td><td>开发订阅管理面板,支持收藏、标记已读、取消订阅等操作</td></tr><tr><td><strong>健康监控与备用资源支持</strong></td><td>开发 GitHub Actions 任务,定期检查 RSS 源的可用性和更新频率</td></tr><tr><td></td><td>为高访问量的 RSS 源设置备用资源,自动切换到备用源</td></tr><tr><td></td><td>为协作者提供 RSS 源状态通知,提醒源失效或需更新</td></tr><tr><td></td><td>创建状态页面,展示 RSS 源健康状态(可用性、频率、错误报告等)</td></tr><tr><td><strong>完善社区激励与协作机制</strong></td><td>引入贡献者排行榜,展示贡献者的提交、修复等贡献记录</td></tr><tr><td></td><td>增加贡献徽章系统,奖励活跃贡献者</td></tr><tr><td></td><td>定期举办线上黑客松活动,激励新功能开发和修复任务</td></tr><tr><td></td><td>创建状态页面,展示社区活动的参与情况和贡献者活跃度</td></tr></tbody></table></div>
|
|||
|
<h2 id="4-用户体验与社区运营">4. 用户体验与社区运营<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#4-用户体验与社区运营" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
|||
|
<h3 id="41-用户体验">4.1 用户体验<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#41-用户体验" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<ol>
|
|||
|
<li><strong>稳定性与高可用性</strong>:
|
|||
|
<ul>
|
|||
|
<li>通过 Cloudflare Workers 的缓存机制,用户可以快速访问代理的 RSS 资源,确保信息流的稳定性和高效性。</li>
|
|||
|
<li>健康监控机制确保 RSS 源始终有效,用户可以获得高质量的订阅体验。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>个性化推荐</strong>:
|
|||
|
<ul>
|
|||
|
<li>系统通过用户订阅行为分析,为用户推荐与其兴趣相关的 RSS 源,帮助用户避免信息过载,并提升信息获取的效率。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>多维度管理</strong>:
|
|||
|
<ul>
|
|||
|
<li>用户可以通过 Web 界面轻松管理订阅源,并根据个人需求进行订阅源分类和筛选。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="42-社区协作与运营">4.2 社区协作与运营<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#42-社区协作与运营" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<ol>
|
|||
|
<li><strong>贡献者管理与激励</strong>:
|
|||
|
<ul>
|
|||
|
<li>通过贡献者排行榜和积分机制,激励社区成员提交优质的 RSS 资源。贡献者可以通过定期提交和维护获得社区认可和奖励。</li>
|
|||
|
<li>核心贡献者将有机会参与项目的长期发展规划,提升社区的参与度和活跃度。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>运营成本管理</strong>:
|
|||
|
<ul>
|
|||
|
<li>初期依赖 Cloudflare Workers 进行代理和路由,随着用户规模扩大,可以逐步引入自建 Nginx 反向代理,优化系统的流量管理,降低运营成本。</li>
|
|||
|
<li>项目也可以通过与云服务提供商建立合作,利用免费资源进一步降低成本。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="43-社区增长策略">4.3 社区增长策略<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#43-社区增长策略" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<ul>
|
|||
|
<li><strong>推广和营销</strong>:通过社交媒体、开发者论坛、开源社区等渠道推广项目,吸引更多用户和开发者参与。</li>
|
|||
|
<li><strong>合作伙伴计划</strong>:与相关的 RSS 订阅平台、信息流工具建立合作伙伴关系,增加 RSSky 的知名度。</li>
|
|||
|
<li><strong>社区激励计划</strong>:引入贡献者奖励机制,通过排行榜、徽章、积分等方式,激励更多开发者和贡献者积极参与项目建设。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="44-持续创新">4.4 持续创新<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#44-持续创新" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<ul>
|
|||
|
<li><strong>AI 驱动的个性化推荐</strong>:引入基于 AI 的算法模型,进一步优化个性化推荐功能,让用户能够快速找到感兴趣的订阅源。</li>
|
|||
|
<li><strong>分布式缓存与优化</strong>:随着用户规模的扩展,引入分布式缓存和 CDN 技术,进一步提高系统的响应速度和稳定性,确保全球范围内用户都能高效访问内容。</li>
|
|||
|
<li><strong>新技术引入</strong>:密切关注前沿技术的发展,如去中心化的内容发布协议、更加高效的内容聚合工具等,并探索这些技术如何与 RSSky 项目结合,推动项目的技术革新。</li>
|
|||
|
</ul>
|
|||
|
<h2 id="5-开发者文档与协作">5. 开发者文档与协作<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#5-开发者文档与协作" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
|||
|
<h3 id="51-开发者支持">5.1 开发者支持<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#51-开发者支持" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<ol>
|
|||
|
<li>详细文档:
|
|||
|
<ul>
|
|||
|
<li>提供详细的开发者文档,包含如何编写爬虫、如何通过 GitHub Actions 自动生成 RSS 源,以及如何提交 PR。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li>标准化工具链:
|
|||
|
<ul>
|
|||
|
<li>制定统一的代码规范和测试标准,确保不同语言的爬虫代码具有一致性,便于项目的长期维护和扩展。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="52-贡献指南">5.2 贡献指南<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#52-贡献指南" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<ol>
|
|||
|
<li>贡献流程:
|
|||
|
<ul>
|
|||
|
<li>开发者可以通过 GitHub 提交 PR,RSS 源的提交和更新将由 GitHub Actions 自动化处理。贡献者可以通过贡献文档了解详细的贡献指南。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li>贡献激励:
|
|||
|
<ul>
|
|||
|
<li>通过贡献者的活跃度和代码质量进行评估,为高质量贡献者提供社区认可和奖励,增强社区凝聚力。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h2 id="6-安全性与合法性">6. 安全性与合法性<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#6-安全性与合法性" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2>
|
|||
|
<h3 id="61-数据安全">6.1 数据安全<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#61-数据安全" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<ul>
|
|||
|
<li><strong>用户隐私保护</strong>:项目不存储用户的个人数据,所有 RSS 资源的获取通过代理完成,确保用户信息的隐私性。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="62-法律合规">6.2 法律合规<a role="anchor" aria-hidden="true" tabindex="-1" data-no-popover="true" href="#62-法律合规" class="internal"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h3>
|
|||
|
<ul>
|
|||
|
<li><strong>内容版权保护</strong>:原则上所有提交的 RSS 资源必须经过社区审核,确保其合法合规,避免侵犯目标网站的版权和知识产权。</li>
|
|||
|
</ul></article><hr/><div class="page-footer"></div></div><div class="right sidebar"><div class="graph"><h3>关系图谱</h3><div class="graph-outer"><div id="graph-container" data-cfg="{"drag":true,"zoom":true,"depth":1,"scale":1.1,"repelForce":0.5,"centerForce":0.3,"linkDistance":30,"fontSize":0.6,"opacityScale":1,"showTags":true,"removeTags":[],"focusOnHover":false}"></div><button id="global-graph-icon" aria-label="Global Graph"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 55 55" fill="currentColor" xml:space="preserve"><path d="M49,0c-3.309,0-6,2.691-6,6c0,1.035,0.263,2.009,0.726,2.86l-9.829,9.829C32.542,17.634,30.846,17,29,17
|
|||
|
s-3.542,0.634-4.898,1.688l-7.669-7.669C16.785,10.424,17,9.74,17,9c0-2.206-1.794-4-4-4S9,6.794,9,9s1.794,4,4,4
|
|||
|
c0.74,0,1.424-0.215,2.019-0.567l7.669,7.669C21.634,21.458,21,23.154,21,25s0.634,3.542,1.688,4.897L10.024,42.562
|
|||
|
C8.958,41.595,7.549,41,6,41c-3.309,0-6,2.691-6,6s2.691,6,6,6s6-2.691,6-6c0-1.035-0.263-2.009-0.726-2.86l12.829-12.829
|
|||
|
c1.106,0.86,2.44,1.436,3.898,1.619v10.16c-2.833,0.478-5,2.942-5,5.91c0,3.309,2.691,6,6,6s6-2.691,6-6c0-2.967-2.167-5.431-5-5.91
|
|||
|
v-10.16c1.458-0.183,2.792-0.759,3.898-1.619l7.669,7.669C41.215,39.576,41,40.26,41,41c0,2.206,1.794,4,4,4s4-1.794,4-4
|
|||
|
s-1.794-4-4-4c-0.74,0-1.424,0.215-2.019,0.567l-7.669-7.669C36.366,28.542,37,26.846,37,25s-0.634-3.542-1.688-4.897l9.665-9.665
|
|||
|
C46.042,11.405,47.451,12,49,12c3.309,0,6-2.691,6-6S52.309,0,49,0z M11,9c0-1.103,0.897-2,2-2s2,0.897,2,2s-0.897,2-2,2
|
|||
|
S11,10.103,11,9z M6,51c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S8.206,51,6,51z M33,49c0,2.206-1.794,4-4,4s-4-1.794-4-4
|
|||
|
s1.794-4,4-4S33,46.794,33,49z M29,31c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6S32.309,31,29,31z M47,41c0,1.103-0.897,2-2,2
|
|||
|
s-2-0.897-2-2s0.897-2,2-2S47,39.897,47,41z M49,10c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S51.206,10,49,10z"></path></svg></button></div><div id="global-graph-outer"><div id="global-graph-container" data-cfg="{"drag":true,"zoom":true,"depth":-1,"scale":0.9,"repelForce":0.5,"centerForce":0.3,"linkDistance":30,"fontSize":0.6,"opacityScale":1,"showTags":true,"removeTags":[],"focusOnHover":true}"></div></div></div><div class="toc desktop-only"><button type="button" id="toc" class aria-controls="toc-content" aria-expanded="true"><h3>目录</h3><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="fold"><polyline points="6 9 12 15 18 9"></polyline></svg></button><div id="toc-content" class><ul class="overflow"><li class="depth-0"><a href="#1-引言" data-for="1-引言">1. 引言</a></li><li class="depth-1"><a href="#11-项目背景" data-for="11-项目背景">1.1 项目背景</a></li><li class="depth-1"><a href="#12-项目愿景" data-for="12-项目愿景">1.2 项目愿景</a></li><li class="depth-0"><a href="#2-项目概述" data-for="2-项目概述">2. 项目概述</a></li><li class="depth-1"><a href="#21-项目目标" data-for="21-项目目标">2.1 项目目标</a></li><li class="depth-1"><a href="#22-阶段性目标" data-for="22-阶段性目标">2.2 阶段性目标</a></li><li class="depth-0"><a href="#3-技术方案" data-for="3-技术方案">3. 技术方案</a></li><li class="depth-1"><a href="#31-总体架构设计" data-for="31-总体架构设计">3.1 总体架构设计</a></li><li class="depth-1"><a href="#32-技术选型" data-for="32-技术选型">3.2 技术选型</a></li><li class="depth-1"><a href="#33-核心功能实现" data-for="33-核心功能实现">3.3 核心功能实现</a></li><li class="depth-1"><a href="#34-项目路线图" data-for="34-项目路线图">3.4 项目路线图</a></li><li class="depth-0"><a href="#4-用户体验与社区运营" data-for="4-用户体验与社区运营">4. 用户体验与社区运营</a></li><li class="depth-1"><a href="#41-用户体验" data-for="41-用户体验">4.1 用户体验</a></li><li class="depth-1"><a href="#42-社区协作与运营" data-for="42-社区协作与运营">4.2 社区协作与运营</a></li><li class="depth-1"><a href="#43-社区增长策略" data-for="43-社区增长策略">4.3 社区增长策略</a></li><li class="depth-1"><a href="#44-持续创新" data-for="44-持续创新">4.4 持续创新</a></li><li class="depth-0"><a href="#5-开发者文档与协作" data-for="5-开发者文档与协作">5. 开发者文档与协作</a></li><li class="depth-1"><a href="#51-开发者支持" data-for="51-开发者支持">5.1 开发者支持</a></li><li class="depth-1"><a href="#52-贡献指南" data-for="52-贡献指南">5.2 贡献指南</a></li><li class="depth-0"><a href="#6-安全性与合法性" data-for="6-安全性与合法性">6. 安全性与合法性</a></li><li class="depth-1"><a href="#61-数据安全" data-for="61-数据安全">6.1 数据安全</a></li><li class="depth-1"><a href="#62-法律合规" data-for="62-法律合规">6.2 法律合规</a></li></ul></div></div><div class="explorer mobile-only"><button type="button" id="explorer" data-behavior="collapse" data-collapsed="collapsed" data-savestate="true" data-tree="[{"path":"Personal","collapsed":true},{"path":"Personal/Blog","collapsed":true},{"path":"Personal/Blog/2018","collapsed":true},{"path":"Personal/Blog/2020","collapsed":true},{"path":"Personal/Blog/2021","collapsed":true},{"path":"Personal/Blog/2022","collapsed":true},{"path":"Personal/Blog/2023","collapsed":true},{"path":"Personal/Blog/2024",&qu
|
|||
|
</script><script type="module">
|
|||
|
let mermaidImport = undefined
|
|||
|
document.addEventListener('nav', async () => {
|
|||
|
if (document.querySelector("code.mermaid")) {
|
|||
|
mermaidImport ||= await import('https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.7.0/mermaid.esm.min.mjs')
|
|||
|
const mermaid = mermaidImport.default
|
|||
|
const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark'
|
|||
|
mermaid.initialize({
|
|||
|
startOnLoad: false,
|
|||
|
securityLevel: 'loose',
|
|||
|
theme: darkMode ? 'dark' : 'default'
|
|||
|
})
|
|||
|
|
|||
|
await mermaid.run({
|
|||
|
querySelector: '.mermaid'
|
|||
|
})
|
|||
|
}
|
|||
|
});
|
|||
|
</script><script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/contrib/copy-tex.min.js" type="application/javascript"></script><script src="../../../postscript.js" type="module"></script></html>
|