<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>CcoMm</title><description>這是C4的個人部落格網站</description><link>https://blog.ccomm.top</link><item><title>訂閱監控看板 (Subscription Monitor • Pure)</title><link>https://blog.ccomm.top/blog/subpulse/subpulse</link><guid isPermaLink="true">https://blog.ccomm.top/blog/subpulse/subpulse</guid><description>一個基於 Cloudflare Workers 構建的輕量級、無伺服器（Serverless）訂閱流量監控看板。</description><pubDate>Thu, 02 Apr 2026 20:15:00 GMT</pubDate><content:encoded>&lt;h1&gt;訂閱監控看板 (Subscription Monitor • Pure)&lt;/h1&gt;
&lt;h2&gt;📌 項目簡介&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./preview.png&quot; alt=&quot;Dashboard 預覽圖&quot;&gt;&lt;/p&gt;
&lt;p&gt;這是一個基於 Cloudflare Workers 構建的輕量級、無伺服器（Serverless）訂閱流量監控看板。該程式將後端 API 解析與前端頁面渲染集於一身，能夠定時獲取指定代理節點訂閱鏈接（如 V2Ray、Clash 等）的流量資訊，並透過一個具有現代化 UI 設計的頁面進行即時視覺化展示。
版本資訊：&lt;strong&gt;STABLE V1&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;✨ 核心特性&lt;/h2&gt;
&lt;h3&gt;後端 (API 層)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;併發數據獲取&lt;/strong&gt;: 使用 &lt;code&gt;Promise.all&lt;/code&gt; 異步併發請求多個訂閱鏈接，極大縮短數據獲取時間。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;嚴格超時控制&lt;/strong&gt;: 內置 &lt;code&gt;fetchWithTimeout&lt;/code&gt; 機制（預設 5 秒），防止因單個異常節點響應過慢而阻塞整個頁面的加載。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;精準請求模擬&lt;/strong&gt;: 請求頭部偽裝為 &lt;code&gt;v2rayN/6.23&lt;/code&gt;，以確保兼容大部分機場/服務商的訂閱下發策略。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能數據提取&lt;/strong&gt;: 自動解析 HTTP 響應頭中的 &lt;code&gt;Subscription-Userinfo&lt;/code&gt; 字段，提取 &lt;code&gt;upload&lt;/code&gt;、&lt;code&gt;download&lt;/code&gt;、&lt;code&gt;total&lt;/code&gt; 和 &lt;code&gt;expire&lt;/code&gt; 數據，並自動換算為 GB 單位。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;內置緩存控制&lt;/strong&gt;: 接口級設置 &lt;code&gt;Cache-Control: public, max-age=60&lt;/code&gt;，靜態 HTML 緩存 &lt;code&gt;3600&lt;/code&gt; 秒，有效降低源站 API 壓力。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;前端 (UI 層)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;現代化純粹設計&lt;/strong&gt;: 採用 &quot;Pure&quot; 主題理念，基於 Tailwind CSS 構建高斯模糊卡片（毛玻璃效果）、漸變高亮背景和絲滑的動畫過渡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;骨架屏加載&lt;/strong&gt;: 數據請求期間提供 Skeleton 骨架屏動畫，拒絕白屏等待，提升用戶體驗。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;動態狀態反饋&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;根據流量使用比例自動改變進度條和數值的顏色（正常、警告、危險）。&lt;/li&gt;
&lt;li&gt;遇到無法連接或解析失敗的節點時，展示專屬的紅色「異常」 UI 樣式。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完善的暗黑模式&lt;/strong&gt;: 支持自動檢測並跟隨系統主題，同時提供一個帶絲滑動畫的「日月膠囊開關」供手動切換（偏好會自動保存至 &lt;code&gt;localStorage&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🛠️ 技術棧&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;運行環境&lt;/strong&gt;: Cloudflare Workers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端樣式&lt;/strong&gt;: Tailwind CSS (透過 CDN 引入) + 原生 CSS 變量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端邏輯&lt;/strong&gt;: Vanilla JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;⚙️ 配置指南&lt;/h2&gt;
&lt;p&gt;在部署之前，你只需要修改代碼最頂部的 &lt;code&gt;SUBSCRIPTIONS&lt;/code&gt; 數組即可：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1. 訂閱地址配置區
const SUBSCRIPTIONS = [
  { name: &quot;你的主用機場&quot;, url: &quot;https://your-sub-link-1.com/xxx&quot; },
  { name: &quot;備用節點 A&quot;, url: &quot;https://your-sub-link-2.com/xxx&quot; },
  { name: &quot;備用節點 B&quot;, url: &quot;https://your-sub-link-3.com/xxx&quot; }
];
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;name&lt;/strong&gt;: 顯示在面板上的自定義名稱。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;url&lt;/strong&gt;: 你的真實訂閱鏈接。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;📡 API 接口參考&lt;/h2&gt;
&lt;p&gt;該 Worker 自帶一個隱藏的數據接口，供前端 AJAX 調用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;路徑&lt;/strong&gt;: &lt;code&gt;/api/traffic&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;請求方式&lt;/strong&gt;: &lt;code&gt;GET&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;響應格式&lt;/strong&gt;: JSON 數組&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;數據結構示例&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;[
  {
    &quot;name&quot;: &quot;你的主用機場&quot;,
    &quot;up_gb&quot;: &quot;12.50&quot;,
    &quot;dl_gb&quot;: &quot;180.20&quot;,
    &quot;used_gb&quot;: &quot;192.70&quot;,
    &quot;total_gb&quot;: &quot;500.00&quot;,
    &quot;usage_percent&quot;: &quot;38.5&quot;,
    &quot;expire_date&quot;: &quot;2026-12-31&quot;
  },
  {
    &quot;name&quot;: &quot;備用節點 A&quot;,
    &quot;error&quot;: true
  }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;🚀 部署說明&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;登錄 Cloudflare Dashboard。&lt;/li&gt;
&lt;li&gt;導航至 &lt;strong&gt;Workers &amp;#x26; Pages&lt;/strong&gt;，點擊 &lt;strong&gt;Create Worker&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;為你的應用輸入一個名稱，點擊 &lt;strong&gt;Deploy&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;部署完成後，點擊 &lt;strong&gt;Edit code&lt;/strong&gt; 進入網頁編輯器。&lt;/li&gt;
&lt;li&gt;將本地 &lt;code&gt;worker.js&lt;/code&gt; 中的所有代碼粘貼並覆蓋編輯器內的預設代碼。&lt;/li&gt;
&lt;li&gt;修改代碼第 2-6 行的 &lt;code&gt;SUBSCRIPTIONS&lt;/code&gt; 配置為你自己的訂閱資訊。&lt;/li&gt;
&lt;li&gt;點擊右上角的 &lt;strong&gt;Save and deploy&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;訪問 Cloudflare 分配的 &lt;code&gt;*.workers.dev&lt;/code&gt; 域名即可查看你的專屬監控看板。&lt;/li&gt;
&lt;/ol&gt;</content:encoded><h:img src="/_astro/cover.BwsQG7Mw.png"/><enclosure url="/_astro/cover.BwsQG7Mw.png"/></item><item><title>在博客中优雅地添加 Bilibili 追番页面 (Astro &amp; Hugo 无 CORS 秒开方案)</title><link>https://blog.ccomm.top/blog/zuifan/bilibili</link><guid isPermaLink="true">https://blog.ccomm.top/blog/zuifan/bilibili</guid><description>如何利用后端构建能力彻底解决前端跨域痛点，实现静态化零延迟的完美追番展示。包含基于 Astro 和 Hugo 两种不同技术栈的完整实现方案。</description><pubDate>Thu, 12 Mar 2026 21:15:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;在個人博客的建設過程中，展示 Bilibili 的「近期追番」記錄是一項常見的擴展需求。&lt;/p&gt;
&lt;p&gt;然而，若直接在前端渲染層使用 JavaScript（如 &lt;code&gt;fetch&lt;/code&gt; API）請求 Bilibili 官方接口，將會受限於瀏覽器的 &lt;strong&gt;CORS（跨域資源共享）&lt;/strong&gt; 安全策略，導致請求被攔截並報錯。雖然存在如 &lt;code&gt;AllOrigins&lt;/code&gt; 或 &lt;code&gt;CorsProxy&lt;/code&gt; 等第三方跨域代理方案，但此類依賴外部公共代理的做法往往伴隨著較高的網絡延遲與服務穩定性風險，難以滿足頁面加載的可用性要求。&lt;/p&gt;
&lt;p&gt;為確保數據獲取的穩定性與展示效果，推薦採用靜態站點生成器 (SSG) 的後端構建能力作為解決方案，即在構建時（或 SSR 渲染階段）直接從服務端拉取第三方數據。&lt;/p&gt;
&lt;p&gt;本文將詳細說明如何在 &lt;strong&gt;Astro&lt;/strong&gt; 與 &lt;strong&gt;Hugo&lt;/strong&gt; 中，實現高可用且無 CORS 限制的 Bilibili 追番頁面集成。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;方案一：基於 Astro 的構建時獲取&lt;/h2&gt;
&lt;p&gt;Astro 框架原生支持在組件的 Server-side 作用域（即 &lt;code&gt;---&lt;/code&gt; 之間）執行 Node.js 代碼及 &lt;code&gt;fetch&lt;/code&gt; 請求。此特性可直接於服務端完成跨域接口的調用，有效規避前端 CORS 限制。&lt;/p&gt;
&lt;h3&gt;核心代碼實現&lt;/h3&gt;
&lt;p&gt;通過創建自定義 Astro 組件，服務器將在構建階段向 Bilibili API 發起請求，並將返回的 JSON 數據直接編譯為靜態 HTML。此方案避免了客戶端額外的網絡開銷，顯著提升了首屏渲染性能。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./astro-bilibli.png&quot; alt=&quot;Astro Bilibili 追番效果預覽&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;---
// src/components/about/BilibiliBangumi.astro
const uid = &quot;3546871211494149&quot;; // 替換為你的 B 站 UID
const api = `https://api.bilibili.com/x/space/bangumi/follow/list?type=1&amp;#x26;follow_status=0&amp;#x26;pn=1&amp;#x26;ps=15&amp;#x26;vmid=${uid}`;

let bangumis = [];
let errorMsg = null;

// 使用 AbortController 設置超時，防止 B 站 API 響應慢拖垮打包或加載速度
const controller = new AbortController();
const timeoutId = setTimeout(() =&gt; controller.abort(), 2500);

try {
  const response = await fetch(api, {
    headers: {
      // 必須偽裝 User-Agent，否則可能被 B 站攔截
      &apos;User-Agent&apos;: &apos;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36&apos;
    },
    signal: controller.signal
  });
  const resData = await response.json();
  if (resData.code === 0 &amp;#x26;&amp;#x26; resData.data &amp;#x26;&amp;#x26; resData.data.list) {
    bangumis = resData.data.list;
  } else {
    errorMsg = `獲取失敗: Code ${resData.code}`;
  }
} catch (e: any) {
  errorMsg = e.name === &apos;AbortError&apos; ? &apos;請求超時 (Timeout)&apos; : e.message;
} finally {
  clearTimeout(timeoutId);
}
---

&amp;#x3C;div class=&quot;mt-4 my-6 not-prose&quot;&gt;
  {errorMsg ? (
    &amp;#x3C;div class=&quot;p-8 border rounded-xl text-center&quot;&gt;無法加載追番數據 ({errorMsg})&amp;#x3C;/div&gt;
  ) : bangumis.length &gt; 0 ? (
    &amp;#x3C;div class=&quot;grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4&quot;&gt;
      {bangumis.map((b: any) =&gt; (
        &amp;#x3C;a href={b.url} target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; class=&quot;group relative block overflow-hidden rounded-xl bg-muted transition-transform hover:-translate-y-1&quot;&gt;
          &amp;#x3C;div class=&quot;aspect-[3/4] overflow-hidden&quot;&gt;
            &amp;#x3C;!-- 核心細節：將 http 替換為 https 防止 Mixed Content 警告 --&gt;
            &amp;#x3C;img src={b.cover.replace(&apos;http://&apos;, &apos;https://&apos;)} alt={b.title} class=&quot;h-full w-full object-cover transition-transform duration-500 group-hover:scale-110&quot; loading=&quot;lazy&quot; referrerpolicy=&quot;no-referrer&quot; /&gt;
          &amp;#x3C;/div&gt;
          &amp;#x3C;div class=&quot;absolute inset-x-0 bottom-0 flex flex-col justify-end bg-gradient-to-t from-black/90 to-transparent p-3 pt-8 opacity-90 transition-opacity group-hover:opacity-100&quot;&gt;
            &amp;#x3C;h3 class=&quot;text-xs font-bold text-white line-clamp-2&quot;&gt;{b.title}&amp;#x3C;/h3&gt;
            &amp;#x3C;p class=&quot;text-[10px] text-zinc-300&quot;&gt;{b.new_ep?.index_show || &apos;未知內容&apos;}&amp;#x3C;/p&gt;
          &amp;#x3C;/div&gt;
        &amp;#x3C;/a&gt;
      ))}
    &amp;#x3C;/div&gt;
  ) : (
    &amp;#x3C;div class=&quot;p-8 border rounded-xl text-center&quot;&gt;暫無追番記錄&amp;#x3C;/div&gt;
  )}
&amp;#x3C;/div&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;技術實現要点：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;超時控制&lt;/strong&gt;：引入 &lt;code&gt;AbortController&lt;/code&gt; 設置 2.5 秒超時閾值，防止第三方 API 響應異常阻塞構建進程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;資源協議升級&lt;/strong&gt;：Bilibili API 返回的封面圖片 URL 默認為 &lt;code&gt;http://&lt;/code&gt;，組件內通過正則表達式或字符串替換將其強制升級為 &lt;code&gt;https://&lt;/code&gt;，以消除現代瀏覽器的 Mixed Content 安全警告。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;方案二：基於 Hugo &lt;code&gt;resources.GetRemote&lt;/code&gt; 實現&lt;/h2&gt;
&lt;p&gt;對於使用 Hugo 框架構建的項目，其原理與 Astro 類似。Hugo 提供了 &lt;code&gt;resources.GetRemote&lt;/code&gt; 內置函數，允許在執行 &lt;code&gt;hugo server&lt;/code&gt; 或構建靜態站點時，由宿主機直接發起後端 HTTP 請求。&lt;/p&gt;
&lt;h3&gt;核心代碼實現&lt;/h3&gt;
&lt;p&gt;可於 Hugo 頁面模板（如 &lt;code&gt;layouts/page/bilibili.html&lt;/code&gt;）中集成以下構建邏輯：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./hugo-bilbili.png&quot; alt=&quot;Hugo Bilibili 追番效果預覽&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;{{ $vmid := &quot;3546871211494149&quot; }}
{{ $url := printf &quot;https://api.bilibili.com/x/space/bangumi/follow/list?type=1&amp;#x26;follow_status=0&amp;#x26;pn=1&amp;#x26;ps=15&amp;#x26;vmid=%s&quot; $vmid }}
&amp;#x3C;!-- 偽裝請求頭 --&gt;
{{ $opts := dict &quot;headers&quot; (dict &quot;User-Agent&quot; &quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64)&quot; &quot;Referer&quot; &quot;https://space.bilibili.com/&quot;) }}

{{ $biliData := dict }}
{{ $err := false }}

&amp;#x3C;!-- 使用最新 Hugo 支援的 try 函數抓取 JSON --&gt;
{{ $res := try (resources.GetRemote $url $opts) }}
{{ if or $res.Err (not $res.Value) }}
    {{ $err = true }}
{{ else }}
    {{ $biliData = $res.Value.Content | unmarshal }}
{{ end }}

&amp;#x3C;div class=&quot;bili-grid&quot;&gt;
    {{ if or $err (not $biliData.data) (not $biliData.data.list) }}
        &amp;#x3C;p&gt;無法在服務端獲取到追番數據。&amp;#x3C;/p&gt;
    {{ else }}
        {{ range first 15 $biliData.data.list }}
            &amp;#x3C;!-- HTML 卡片渲染 --&gt;
            {{ $coverUrl := replace .cover &quot;http://&quot; &quot;https://&quot; }}
            &amp;#x3C;a href=&quot;{{ .url }}&quot; target=&quot;_blank&quot; class=&quot;bili-card&quot;&gt;
                &amp;#x3C;img src=&quot;{{ $coverUrl }}&quot; alt=&quot;{{ .title }}&quot; loading=&quot;lazy&quot; referrerpolicy=&quot;no-referrer&quot;&gt;
                &amp;#x3C;h3&gt;{{ .title }}&amp;#x3C;/h3&gt;
            &amp;#x3C;/a&gt;
        {{ end }}
    {{ end }}
&amp;#x3C;/div&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述代碼通過 &lt;code&gt;resources.GetRemote&lt;/code&gt; 在服務器端獲取 JSON 數據，經 &lt;code&gt;unmarshal&lt;/code&gt; 方法反序列化後，通過循環指令安全地編譯為 HTML 結構。該方式不僅解決了 CORS 問題，亦對搜索引擎優化（SEO）具有積極作用。&lt;/p&gt;
&lt;h2&gt;結語&lt;/h2&gt;
&lt;p&gt;總結而言，無論採用 Astro 的 Server-side 腳本，還是 Hugo 的 &lt;code&gt;GetRemote&lt;/code&gt; 函數，利用靜態站點生成器的後端獲取能力渲染第三方 API 數據，均是提升頁面加載性能並徹底解決跨域限制的最佳實踐。本指南旨在為開發者處理類似外部數據集成問題時提供提供高可用的參考架構。&lt;/p&gt;</content:encoded><h:img src="/_astro/bilibili-color.MOpIWKxB.png"/><enclosure url="/_astro/bilibili-color.MOpIWKxB.png"/></item><item><title>如何使用 Cloudflare API 為 Astro 網站新增高級數據監測大屏</title><link>https://blog.ccomm.top/blog/cloudflare-jc/%E5%AE%9E%E7%8E%B0cloudflare%E6%95%B0%E6%8D%AE%E7%9B%91%E6%B5%8B%E9%9D%A2%E6%9D%BF</link><guid isPermaLink="true">https://blog.ccomm.top/blog/cloudflare-jc/%E5%AE%9E%E7%8E%B0cloudflare%E6%95%B0%E6%8D%AE%E7%9B%91%E6%B5%8B%E9%9D%A2%E6%9D%BF</guid><description>手把手教你在 Astro 項目中，利用 Cloudflare GraphQL API 和 ECharts 構建一個純本地渲染、不洩露密鑰的極速網站流量與安全監控面板。</description><pubDate>Tue, 10 Mar 2026 14:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;構建專屬的網站數據大屏&lt;/h1&gt;
&lt;p&gt;在維護個人博客或網站時，了解網站的流量、帶寬消耗以及安全攔截情況是非常重要的。通常我們需要登錄 Cloudflare 的控制台才能看到這些數據。但是，能不能&lt;strong&gt;把 Cloudflare 的數據面板直接嵌入到我們自己的網站中&lt;/strong&gt;呢？&lt;/p&gt;
&lt;p&gt;答案是可以的！這篇文章將詳細說明如何通過 Cloudflare 最新的 &lt;strong&gt;GraphQL Analytics API&lt;/strong&gt; 以及強大的開源圖表庫 &lt;strong&gt;ECharts&lt;/strong&gt;，為你的 Astro 網站從零構建一個美觀、詳細、極速加載且暗黑模式適配的「數據監控大屏」。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;功能圖預覽&lt;/h2&gt;
&lt;p&gt;先來看看我們最終實現的無縫嵌入、沉浸式的數據大屏效果：&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;我們實現了什麼功能？&lt;/h2&gt;
&lt;p&gt;在這個專屬的監控面板中，我們完美復刻並優化了 Cloudflare 官方的各項核心指標：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;全景基礎流量統計&lt;/strong&gt;：精確統計過去 24 小時內的請求總數、快取命中數、總帶寬消耗、唯一訪問者(UV)及帶寬節省比例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流量趨勢疊加折線圖&lt;/strong&gt;：使用 ECharts 構建平滑的雙色填充折線圖，直觀對比「已快取」與「未快取」的實時流量起伏。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS 與安全性分析&lt;/strong&gt;：完美還原官方界面的水平堆疊條形圖，涵蓋 TLS 協議分佈以及 WAF 惡意請求攔截佔比。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;邊緣快取秒開 (Edge Caching)&lt;/strong&gt;：採用 &lt;code&gt;Cache-Control&lt;/code&gt; 配置 Vercel CDN，讓原本需要數秒鐘向 Cloudflare 查詢的複雜大屏實現 &lt;strong&gt;0毫秒瞬間加載 (12小時刷新機制)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;避坑指南與注意事項&lt;/h2&gt;
&lt;p&gt;在編寫這個功能時，有幾個極其重要的細節需要注意：&lt;/p&gt;
&lt;h3&gt;1. 棄用舊版 REST API&lt;/h3&gt;
&lt;p&gt;許多早期的教程會教你使用 &lt;code&gt;/analytics/dashboard&lt;/code&gt; 這個 REST 接口。請注意，該接口&lt;strong&gt;目前已被 Cloudflare 官方廢棄&lt;/strong&gt;，如果你直接調用會收到 &lt;code&gt;404 Not Found&lt;/code&gt; 的錯誤。&lt;strong&gt;必須&lt;/strong&gt;遷移至全新的 GraphQL API (&lt;code&gt;https://api.cloudflare.com/client/v4/graphql&lt;/code&gt;)。&lt;/p&gt;
&lt;h3&gt;2. 免費版 API 的字段限制&lt;/h3&gt;
&lt;p&gt;這是一個巨大的坑！如果你使用的是 Cloudflare 免費計畫 (Free Plan)，GraphQL 中的部分高級維度（如 &lt;code&gt;clientSSLProtocol&lt;/code&gt; 和 &lt;code&gt;firewallEventsAdaptiveGroups&lt;/code&gt;）是被&lt;strong&gt;嚴格鎖定&lt;/strong&gt;的。強行查詢會導致整個請求崩潰報錯。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;解決方案&lt;/strong&gt;：在下方的代碼中，我們使用真實的總流量數據配合「動態比例分配算法」，在前端完美模擬了 TLS 和安全攔截的 UI 展示。未來若升級企業版，只需將模擬變數替換為真實字段即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3. API 密鑰安全&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;絕對不要在前端發起對 Cloudflare 的請求！&lt;/strong&gt; 這會導致你的 API Token 暴露給所有訪客。我們充分利用了 Astro 的 SSR (Server-Side Rendering) 能力，在組件的 Server 端發出請求，將純天然的渲染結果與數據下發給瀏覽器。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;怎麼在這個框架和主題中實現？代碼教程&lt;/h2&gt;
&lt;h3&gt;第一步：獲取憑證與配置環境變量&lt;/h3&gt;
&lt;p&gt;要調用 API，你需要兩個核心參數：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Zone ID (區域 ID)&lt;/strong&gt;：在你的 Cloudflare 域名概述頁面右下角獲取。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Token&lt;/strong&gt;：前往 &lt;code&gt;我的個人資料 -&gt; API 令牌 -&gt; 創建令牌&lt;/code&gt;。僅需授予 &lt;code&gt;Zone : Analytics : Read&lt;/code&gt; 的只讀權限。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在 Astro 項目的根目錄 &lt;code&gt;.env&lt;/code&gt; 文件中配置它們（Vercel 部署則需要在 Web 控制台配置環境變量）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-env&quot;&gt;CLOUDFLARE_ZONE_ID=你的_Zone_ID_字符串
CLOUDFLARE_API_TOKEN=你的_只讀_API_Token
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;第二步：編寫數據頁面邏輯&lt;/h3&gt;
&lt;p&gt;我們在 &lt;code&gt;src/pages&lt;/code&gt; 路由中新建頁面 &lt;code&gt;analytics/index.astro&lt;/code&gt;。下面是完整的集成邏輯。由於篇幅原因，此處展示核心的 GraphQL 獲取與動態分發代碼：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-astro&quot;&gt;---
import PageLayout from &apos;@/layouts/CommonPage.astro&apos;

// 設置 12 小時邊緣快取，避免每次載入都要等待 API，實現秒開
Astro.response.headers.set(&apos;Cache-Control&apos;, &apos;public, max-age=43200, s-maxage=43200&apos;);

// 初始化統計變量
let totalRequests = 0, cachedRequests = 0, uncachedRequests = 0;
let totalBandwidth = 0, cachedBandwidth = 0, uniqueVisitors = 0;
let timeseriesData: any[] = [];
let tlsVersions: Record&amp;#x3C;string, number&gt; = {};
let secTotalRequests = 0, secMitigated = 0, secServeCloudflare = 0, secServeOrigin = 0;

try {
  const zoneId = (import.meta.env.CLOUDFLARE_ZONE_ID || &apos;&apos;).trim()
  const apiToken = (import.meta.env.CLOUDFLARE_API_TOKEN || &apos;&apos;).trim()

  const now = new Date()
  const since24h = new Date(now.getTime() - 24 * 60 * 60 * 1000)
  const sinceDatetime = since24h.toISOString()
  const untilDatetime = now.toISOString()

  // 構建安全的 Node.js GraphQL 請求
  const graphqlQuery = {
    query: `
      query {
        viewer {
          zones(filter: { zoneTag: &quot;${zoneId}&quot; }) {
            hourly: httpRequests1hGroups(
              limit: 24, filter: { datetime_geq: &quot;${sinceDatetime}&quot;, datetime_lt: &quot;${untilDatetime}&quot; }, orderBy: [datetime_ASC]
            ) {
              dimensions { datetime }
              sum { requests, cachedRequests, bytes, cachedBytes }
            }
          }
        }
      }
    `
  }

  const response = await fetch(&apos;https://api.cloudflare.com/client/v4/graphql&apos;, {
    method: &apos;POST&apos;,
    headers: { Authorization: `Bearer ${apiToken}`, &apos;Content-Type&apos;: &apos;application/json&apos; },
    body: JSON.stringify(graphqlQuery)
  })

  const result = await response.json()
  const zoneData = result?.data?.viewer?.zones?.[0]

  // === 聚合與計算邏輯 ===
  for (const h of zoneData.hourly || []) {
    totalRequests += h.sum.requests || 0
    cachedRequests += h.sum.cachedRequests || 0
    totalBandwidth += h.sum.bytes || 0
    cachedBandwidth += h.sum.cachedBytes || 0
  }
  uncachedRequests = Math.max(0, totalRequests - cachedRequests)

  // 時序數據（用於折線圖）
  timeseriesData = zoneData.hourly.map((h: any) =&gt; ({
    time: h.dimensions.datetime,
    uncached: Math.max(0, (h.sum.requests || 0) - (h.sum.cachedRequests || 0)),
    cached: h.sum.cachedRequests || 0
  }))

  // 由於免費版 API 的限制，我們基於真實總量動態生成等比例的 TLS 與 WAF 攔截視角
  const noneReqs = Math.max(0, Math.floor(totalRequests * 0.001))
  const unknownReqs = Math.max(0, Math.floor(totalRequests * 0.102))
  tlsVersions = {
    &apos;Unknown&apos;: unknownReqs,
    &apos;None (not secure)&apos;: noneReqs,
    &apos;TLS v1.3&apos;: Math.max(0, totalRequests - noneReqs - unknownReqs)
  }

  secTotalRequests = totalRequests
  secMitigated = Math.max(0, Math.floor(secTotalRequests * 0.002))
  secServeCloudflare = cachedRequests
  secServeOrigin = Math.max(0, uncachedRequests - secMitigated)

} catch (error) {
  console.error(&apos;[Analytics] Fetch error:&apos;, error)
}
---

&amp;#x3C;PageLayout title=&apos;數據&apos;&gt;
  &amp;#x3C;!-- HTML UI 與 TailwindCSS 樣式排版 --&gt;
  &amp;#x3C;h2 id=&apos;security&apos;&gt;每日請求數&amp;#x3C;/h2&gt;
  &amp;#x3C;div class=&quot;text-xs text-muted-foreground mb-4&quot;&gt;過去 24 小時&amp;#x3C;/div&gt;
  
  &amp;#x3C;!-- 根據計算好的 `secTotalRequests` 等變數渲染 DOM --&gt;
  &amp;#x3C;div class=&quot;grid grid-cols-2 md:grid-cols-4 gap-4 mb-4&quot;&gt;
    &amp;#x3C;!-- ...數字展示區塊... --&gt;
  &amp;#x3C;/div&gt;
  
  &amp;#x3C;div class=&quot;w-full bg-muted border rounded-xl p-4 mb-8&quot;&gt;
    &amp;#x3C;div id=&quot;sec-chart&quot; style=&quot;width: 100%; height: 20px;&quot;&gt;&amp;#x3C;/div&gt;
  &amp;#x3C;/div&gt;

  &amp;#x3C;!-- 在客戶端引入 ECharts 並注入我們在 SSR 掛載好的變數數據 --&gt;
  &amp;#x3C;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/echarts/5.5.0/echarts.min.js&quot; is:inline&gt;&amp;#x3C;/script&gt;
  &amp;#x3C;script is:inline define:vars={{ timeseriesData, tlsVersions, secMitigated, secServeCloudflare, secServeOrigin }}&gt;
    // ECharts 的圖表初始化與適配器 (chart.setOption 等邏輯)
  &amp;#x3C;/script&gt;
&amp;#x3C;/PageLayout&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;第三步：將入口掛載到你的網站導航&lt;/h3&gt;
&lt;p&gt;這個步驟因 Astro 具體使用的主題而異。以 Astro Theme Pure 為例，你只需要到 &lt;code&gt;src/site.config.ts&lt;/code&gt; 中追加菜單鏈接即可：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;export const menuLinks = [
  { link: &apos;/blog&apos;, label: &apos;Blog&apos; },
  { link: &apos;/projects&apos;, label: &apos;Projects&apos; },
  { link: &apos;/analytics&apos;, label: &apos;數據&apos; }, // 新增的數據監測入口
];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大功告成！現在你可以提交代碼並部署到 Vercel，享受擁有即時網站大數據掌控權的樂趣了。&lt;/p&gt;</content:encoded><h:img src="/_astro/cloudflare-color.D1OppbMD.png"/><enclosure url="/_astro/cloudflare-color.D1OppbMD.png"/></item><item><title>碎碎念：找實習、生病與一塊薯餅的治癒</title><link>https://blog.ccomm.top/blog/%E9%86%89%E9%B8%A1%E6%97%A5%E8%AE%B0</link><guid isPermaLink="true">https://blog.ccomm.top/blog/%E9%86%89%E9%B8%A1%E6%97%A5%E8%AE%B0</guid><description>最近幾個月忙於尋找實習，加上反覆感冒發燒，博客與 Astro 項目暫時停擺。生活雖然疲憊，但吃塊肯德基薯餅還是能開心一下。</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近這幾個月，生活的主旋律被「找實習」和「求職」徹底佔據，以至於博客已經長滿了荒草。之前學過的技術感覺都快還給大自然了，那個正準備用 Astro 框架重構的現代化博客系統，現在打開代碼庫完全不知道該從何處下手，大腦一片空白，索性暫時徹底放棄了。&lt;/p&gt;
&lt;p&gt;更糟糕的是，這兩個月來身體一直抱恙，感冒發燒像是一個無限循環的死胡同。每次剛覺得好轉一些，新的病狀又接踵而至，反反覆覆的折磨讓我一度以為自己這波真的要「寄」了。&lt;/p&gt;
&lt;p&gt;拖著病體找實習更是讓人頭大如斗。現在的招聘市場彷彿在疊 Buff：有的公司不要實習生，有的要求應屆生必須有豐富的工作經驗，甚至還有嫌棄住得離公司太遠的……各種奇葩的拒絕理由應有盡有，真的讓人感到心力交瘁，嗚嗚嗚……&lt;/p&gt;
&lt;p&gt;不過，今天就寫到這裡吧。心太累了，與其繼續內耗，不如去買塊肯德基的薯餅犒勞一下自己。一口咬下去酥酥脆脆，嘻嘻，至少今天的快樂額度又達標了！&lt;/p&gt;</content:encoded><h:img src="https://img.cdn1.vip/i/69af3606bd9a0_1773090310.png"/><enclosure url="https://img.cdn1.vip/i/69af3606bd9a0_1773090310.png"/></item><item><title>PROTOCOL-RELAY 介紹</title><link>https://blog.ccomm.top/blog/protocol-relay</link><guid isPermaLink="true">https://blog.ccomm.top/blog/protocol-relay</guid><description>一個基於 Astro + React 構建的磁帶未來主義（Cassette Futurism）風格 Git 加速工具，透過 CDN 邊緣節點轉發流量實現高速訪問。</description><pubDate>Sat, 27 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;PROTOCOL-RELAY // GIT ACCELERATOR&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;/// BUREAU OF DATA TRANSPORT // SECURE CHANNEL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一個基於 Astro + React 構建的磁帶未來主義（Cassette Futurism）風格 Git 加速工具。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/badge/license-MIT-orange.svg&quot; alt=&quot;License&quot;&gt;
&lt;img src=&quot;https://img.shields.io/badge/style-Cassette_Futurism-black.svg&quot; alt=&quot;Style&quot;&gt;
&lt;img src=&quot;https://img.shields.io/badge/deployed_on-EdgeOne_Pages-blue.svg&quot; alt=&quot;Deployed&quot;&gt;&lt;/p&gt;
&lt;h2&gt;📖 簡介 (Introduction)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;PROTOCOL-RELAY&lt;/strong&gt; 是一個極簡的 GitHub 文件與倉庫加速前端。它不存儲任何文件，而是作為一個「協議中繼」，透過 CDN 邊緣節點轉發流量，實現高速訪問 GitHub 資源。&lt;/p&gt;
&lt;p&gt;項目採用了冷峻的工業復古設計風格（Project Nebula），模擬行政審批與數據終端的交互體驗。&lt;/p&gt;
&lt;h3&gt;✨ 核心特性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;0 存儲成本&lt;/strong&gt;：純前端頁面，利用 EdgeOne 進行回源加速。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能解析&lt;/strong&gt;：支持完整 URL 輸入，也支持 &lt;code&gt;user/repo&lt;/code&gt; 簡寫模式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多協議支持&lt;/strong&gt;：一鍵生成 &lt;code&gt;Git Clone&lt;/code&gt;、&lt;code&gt;Wget&lt;/code&gt;、&lt;code&gt;cURL&lt;/code&gt; 及 &lt;code&gt;Raw&lt;/code&gt; 鏈接。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;直接下載&lt;/strong&gt;：提供 ZIP 源碼包或單文件的 Direct Download 按鈕。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;極致性能&lt;/strong&gt;：基於 Astro 構建，EdgeOne 邊緣分發。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;📂 目錄結構 (Directory Structure)&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;PROTOCOL-RELAY/
├── public/                 # 靜態資源文件
├── src/
│   ├── components/         # React 組件庫
│   │   └── ProtocolTerminal.jsx  # 核心交互終端（解析邏輯所在）
│   ├── layouts/            # 頁面佈局文件
│   │   └── Layout.astro    # 全局佈局（字體、背景網格）
│   └── pages/              # 路由頁面
│       └── index.astro     # 首頁組裝
├── astro.config.mjs        # Astro 配置文件 (集成 React &amp;#x26; Tailwind)
├── tailwind.config.mjs     # Tailwind 樣式配置 (定義復古配色與字體)
├── package.json            # 項目依賴
└── README.md               # 說明文檔
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;🕹️ 使用方法 (Usage)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;訪問終端&lt;/strong&gt;：打開部署好的網站。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;輸入目標&lt;/strong&gt;：在輸入框中填入 GitHub 鏈接或倉庫名。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;支持格式 1 (完整鏈接)&lt;/em&gt;: &lt;code&gt;https://github.com/torvalds/linux&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;支持格式 2 (簡寫)&lt;/em&gt;: &lt;code&gt;torvalds/linux&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;支持格式 3 (具體文件)&lt;/em&gt;: &lt;code&gt;https://github.com/torvalds/linux/blob/master/README&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;發起協議&lt;/strong&gt;：點擊橘色的 &lt;strong&gt;INITIATE PROTOCOL // 提交申請&lt;/strong&gt; 按鈕。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;獲取清單&lt;/strong&gt;：等待「蓋章」批准後，複製下方的加速命令：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GIT CLONE&lt;/strong&gt;: 用於克隆倉庫。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WGET&lt;/strong&gt;: 用於 &lt;code&gt;wget&lt;/code&gt; 下載。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cURL&lt;/strong&gt;: 用於 &lt;code&gt;curl&lt;/code&gt; 下載。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ACCELERATED RAW URL&lt;/strong&gt;: 原始文件的加速直鏈。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direct Download&lt;/strong&gt;: 瀏覽器直接下載 ZIP 包或文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;🚀 部署方法 (Deployment)&lt;/h2&gt;
&lt;p&gt;本項目分為 &lt;strong&gt;前端托管&lt;/strong&gt; 和 &lt;strong&gt;CDN 加速配置&lt;/strong&gt; 兩部分，推薦使用 &lt;strong&gt;騰訊雲 EdgeOne&lt;/strong&gt; 一站式完成。&lt;/p&gt;
&lt;h3&gt;1. 本地環境準備&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 克隆項目
git clone https://github.com/C-4-C-4/PROTOCOL-RELAY.git
cd PROTOCOL-RELAY

# 安裝依賴 (推薦使用 npm)
npm install

# 本地調試
npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 前端部署 (EdgeOne Pages)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;將代碼推送到你的 GitHub 倉庫。&lt;/li&gt;
&lt;li&gt;登錄 &lt;a href=&quot;https://console.cloud.tencent.com/edgeone&quot;&gt;騰訊雲 EdgeOne 控制台&lt;/a&gt;，進入 &lt;strong&gt;Pages (頁面托管)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;點擊 &lt;strong&gt;新建項目&lt;/strong&gt;，連接你的 GitHub 倉庫。&lt;/li&gt;
&lt;li&gt;配置構建參數：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;框架預設&lt;/strong&gt;: &lt;code&gt;Astro&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;構建命令&lt;/strong&gt;: &lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;構建目錄&lt;/strong&gt;: &lt;code&gt;dist&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;點擊部署，等待完成。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. 加速通道配置 (核心步驟)&lt;/h3&gt;
&lt;p&gt;為了讓加速鏈接真正生效，你需要配置一個自定義域名作為「中繼隧道」。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;添加站點&lt;/strong&gt;：在 EdgeOne 控制台添加你的域名（如 &lt;code&gt;example.com&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;添加加速域名&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;新增子域名（如 &lt;code&gt;git.example.com&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;源站地址&lt;/strong&gt;: &lt;code&gt;github.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;源站協議&lt;/strong&gt;: &lt;code&gt;HTTPS&lt;/code&gt; (端口 443)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改回源 Host (至關重要)&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;進入該域名的配置頁面 -&gt; &lt;strong&gt;回源配置&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;將 &lt;strong&gt;回源 Host&lt;/strong&gt; 修改為 &lt;strong&gt;自定義 Host&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;填入：&lt;code&gt;github.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;注意：不修改此項會導致 502 錯誤。&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置 HTTPS&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;在域名管理中申請免費證書並開啟強制 HTTPS。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改前端代碼&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;打開 &lt;code&gt;src/components/ProtocolTerminal.jsx&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;修改 &lt;code&gt;const EDGE_DOMAIN&lt;/code&gt; 的值為你剛才配置的加速域名（如 &lt;code&gt;https://git.example.com&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;重新推送代碼部署。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;👤 作者 (Author)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CCCC4444&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Github: &lt;a href=&quot;https://github.com/C-4-C-4&quot;&gt;@C-4-C-4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Project Repo: &lt;a href=&quot;https://github.com/C-4-C-4/PROTOCOL-RELAY&quot;&gt;PROTOCOL-RELAY&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;/// SYSTEM STATUS: ONLINE&lt;/em&gt;
&lt;em&gt;/// END OF TRANSMISSION&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="https://img.scdn.io/i/694fb64ab695c_1766831690.webp"/><enclosure url="https://img.scdn.io/i/694fb64ab695c_1766831690.webp"/></item><item><title>Nebula.Ins.Blog 項目</title><link>https://blog.ccomm.top/blog/nebulainsblog-%E9%A1%B9%E7%9B%AE</link><guid isPermaLink="true">https://blog.ccomm.top/blog/nebulainsblog-%E9%A1%B9%E7%9B%AE</guid><description>一個更適合生活類的圖文博客項目，目前處於開發中。</description><pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Nebula-Ins-Blog&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;一個更適合生活類的圖文博客項目&lt;/strong&gt;
&lt;strong&gt;開發中，有可能是半成品，太累了，不是很想動&lt;/strong&gt;&lt;/p&gt;</content:encoded><h:img src="https://img.scdn.io/i/693a37695e8e2_1765422953.webp"/><enclosure url="https://img.scdn.io/i/693a37695e8e2_1765422953.webp"/></item><item><title>優化了網站的一些功能</title><link>https://blog.ccomm.top/blog/%E4%BC%98%E5%8C%96%E4%BA%86%E7%BD%91%E7%AB%99%E7%9A%84%E4%B8%80%E4%BA%9B%E5%8A%9F%E8%83%BD</link><guid isPermaLink="true">https://blog.ccomm.top/blog/%E4%BC%98%E5%8C%96%E4%BA%86%E7%BD%91%E7%AB%99%E7%9A%84%E4%B8%80%E4%BA%9B%E5%8A%9F%E8%83%BD</guid><description>2025年12月8日網站優化記錄：修復了移動端導航欄重疊問題，並為無數據庫後台開發了基於 LocalStorage 和 GitHub API 的暫存區批量提交功能。</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;對的，我又熬了一晚，這次對網站一些內容做了優化&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;一、移動端&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;之前導航欄會黏在一起，還有按鈕被標題覆蓋的問題解決了&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;二、後台&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;由於網站是沒有數據庫的，是直接讀取倉庫下的內容，每次在後台提交新內容就會觸發重新部署，等個30秒左右，太浪費時間了，就想著能不能暫存起來，然後再一併提交上傳，然後花了點時間優化了這個玩意！&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;1、攔截 (Interception)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;整個流程完全在你的瀏覽器（客戶端）和服務器（Next.js API）之間流轉：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;當你在編輯器點擊 + ADD TO BUFFER 或者在列表點擊 [DEL_STAGE] 時：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;程序阻止了表單的默認提交行為（不再直接發請求給服務器）。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;程序把你的操作意圖打包成一個 JSON 對象（Action Object）。&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;比如：{ type: &quot;DELETE&quot;, file: &quot;post-1.md&quot; }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2、通信與存儲 (Event &amp;#x26; Storage)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;因為「編輯器組件」和「底部的暫存條組件」在代碼裡隔得很遠，它們怎麼由通信？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自定義事件 (Custom Event)：編輯器發出一個名為 add-to-staging 的廣播信號。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;監聽器：底部的 StagingManager 組件一直在監聽這個信號。一旦聽到，就把數據抓過來。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;去重邏輯：StagingManager 會檢查：「這個文件之前操作過嗎？」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果之前是「修改A」，現在是「修改B」，它會把A刪掉，只保留B（只保留最後一次狀態）。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果之前是「修改」，現在是「刪除」，它會直接變成「刪除」。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;持久化：將整理好的數組存入瀏覽器的 localStorage。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;作用：即使你不小心刷新了頁面，或者關掉了瀏覽器再打開，暫存區的數據依然還在，不會丟失。&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;3、批量提交 (Batch Execution)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;當你點擊底部的 PUSH TO CLOUD 按鈕時：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前端把 localStorage 裡存的那一堆操作數組（比如裡面有3個修改，2個刪除），一次性打包發給服務器。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Server Action (batch.ts) 接收到這個大數組。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;服務器開始 for 循環，依次執行每一個操作（調用 GitHub API）。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;所有操作執行完畢後，通知 Vercel：「數據變了，請重新構建網站」。&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;三、代碼層面&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;1、在 src/components/AdminPostForm.tsx 中：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const event = new CustomEvent(&quot;add-to-staging&quot;, { detail: newItem });
window.dispatchEvent(event);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;編輯器不需要知道暫存條存不存在，它只管廣播「我要存東西」。底部暫存條也不需要知道是誰發的，它只管接收。這讓代碼結構很清晰。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2、在 src/components/StagingManager.tsx 中：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;localStorage.setItem(&quot;nebula_staging_buffer&quot;, JSON.stringify(next));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;這是為了防丟。React 的 state (useState) 在刷新頁面後會清空。如果不用 LocalStorage，你辛辛苦苦暫存了10篇文章，手抖刷新一下就全沒了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3、在 src/app/actions/batch.ts 中：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for (const op of operations) {
  switch (op.type) {
    case &quot;DELETE_POST&quot;: await deleteGithubFile(...); break;
    case &quot;SAVE_POST&quot;: await saveGithubFile(...); break;
    // ...
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;服務器其實比較「笨」，它只是機械地把發過來的清單執行一遍。真正的智能邏輯（去重、覆蓋、撤銷）都在前端做完了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;具體圖片：&lt;/strong&gt;&lt;/p&gt;</content:encoded><h:img src="https://img.scdn.io/i/6935f1deace64_1765143006.webp"/><enclosure url="https://img.scdn.io/i/6935f1deace64_1765143006.webp"/></item><item><title>熬了一晚上給網站新增了幾個小功能</title><link>https://blog.ccomm.top/blog/endfieldsys%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD</link><guid isPermaLink="true">https://blog.ccomm.top/blog/endfieldsys%E6%96%B0%E5%A2%9E%E5%8A%9F%E8%83%BD</guid><description>2025年12月7日熬夜為網站新增了GitHub倉庫、B站追番列表、音樂播放器、時間線以及RSS訂閱列表等功能，並優化了友鏈頁面。</description><pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ss&lt;/p&gt;
&lt;p&gt;**2025年12月7日，我好困，凌晨2點一直到現在的7點18分，給網站加了幾個小功能，雖然感覺沒啥特別大的用處就是了 ;m; **&lt;/p&gt;
&lt;h1&gt;一、新增內容&lt;/h1&gt;
&lt;h4&gt;1、github倉庫內容頁面&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;這個功能的實現核心在於 利用 GitHub 官方 API 動態獲取數據，配合 Next.js 的 服務端組件 (Server Components) 和 增量靜態再生 (ISR) 技術。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;簡單來說，它的工作流程是：&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;你的服務器 -&gt; 向 GitHub 發請求 -&gt; 拿到數據 -&gt; 渲染成漂亮的卡片 -&gt; 展示給用戶。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;· 數據獲取層 (The Data Fetcher)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 核心代碼片段
export const fetchGithubRepos = cache(async () =&gt; {
  const { data } = await octokit.request(&quot;GET /users/{username}/repos&quot;, { ... });
  // ... 數據清洗邏輯 ...
  return filtered.map(repo =&gt; ({ ... }));
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;· 頁面渲染層 (The Page)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export const revalidate = 3600;
const isActive = (new Date().getTime() - lastUpdate.getTime()) &amp;#x3C; 90 * 24 * 60 * 60 * 1000;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;頁面展示圖片：&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;2、bilibili追番列表頁面&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;·  數據源：公開的 B 站 API&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;原理：利用 B 站接口 https://api.bilibili.com/x/space/bangumi/follow/list。
參數：
vmid: 你的 UID。
type: 1 代表追番。
pn: 頁碼。
ps: 每頁數量。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;· 服務端數據抓取 (Server-Side Fetching)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;在 src/lib/bilibili.ts 中，定義了 fetchBangumiList 函數
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;頁面展示圖片：&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;3、音樂播放頁面&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    User[用戶訪問頁面] --&gt; Page[讀取 songs.json]
    Page --&gt; Player[渲染播放器組件]
    
    Player --1. 播放音頻--&gt; NeteaseMP3[網易雲 MP3 接口]
    
    Player --2. 請求歌詞--&gt; MyAPI[你的 API (/api/music/lyric)]
    MyAPI --3. 偽造請求頭--&gt; NeteaseLRC[網易雲歌詞接口]
    NeteaseLRC --4. 返回歌詞數據--&gt; MyAPI
    MyAPI --5. 轉發歌詞--&gt; Player
    
    Player --6. 解析並同步顯示--&gt; UI[界面展示]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;頁面展示圖片：&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;4、時間線頁面&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    A[數據源: src/data/timeline.json] --&gt;|讀取| B(服務端頁面: src/app/timeline/page.tsx)
    
    subgraph Server_Side_Rendering [服務端處理]
    B --&gt;|1. fetchJsonData| B1[獲取 JSON 數據]
    B1 --&gt;|2. sort| B2[按日期倒序排列]
    end
    
    B2 --&gt;|傳遞數據 Props| C(客戶端組件: TimelineItem.tsx)
    
    subgraph Client_Side_Rendering [客戶端渲染]
    C --&gt;|Framer Motion| D[執行進入動畫]
    C --&gt;|CSS Styling| E[根據 Type 渲染不同顏色]
    end
    
    D &amp;#x26; E --&gt; F[最終頁面展示]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;頁面展示圖片：&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;5、RSS訂閱列表頁面&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    A[你的通訊錄] --&gt;|讀取列表| B(信號接收塔)
    B --&gt;|並發請求| C{外部好友的博客}
    C --&gt;|返回 XML 數據| B
    B --&gt;|翻譯/解析| D[標準化數據包]
    D --&gt;|發送給| E[你的朋友圈頁面]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;頁面展示圖片：&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;二、優化內容&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;為友聯新增隨機傳送和搜索功能&lt;/strong&gt;
&lt;strong&gt;頁面展示圖片：&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;三、想說的話&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;好困，寫完這篇文章都7點51了，熬了一晚上，實在頂不住了！&lt;/strong&gt;&lt;/p&gt;</content:encoded><h:img src="https://img.scdn.io/i/6934b8de4a244_1765062878.webp"/><enclosure url="https://img.scdn.io/i/6934b8de4a244_1765062878.webp"/></item><item><title>Nebula.ICP 介紹</title><link>https://blog.ccomm.top/blog/nebula-icp-%E4%BB%8B%E7%BB%8D</link><guid isPermaLink="true">https://blog.ccomm.top/blog/nebula-icp-%E4%BB%8B%E7%BB%8D</guid><description>一個基於 Cloudflare D1 的去中心化、賽博朋克風格的數字實體檔案庫系統。無服務器架構，邊緣秒級響應。</description><pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🌌 NEBULA.ICP | Decentralized Filing System&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/badge/Style-Neo--Brutalism-orange?style=for-the-badge&amp;#x26;labelColor=000&quot; alt=&quot;Style&quot;&gt;
&lt;img src=&quot;https://img.shields.io/badge/Astro-4.0-BC52EE?style=for-the-badge&amp;#x26;logo=astro&amp;#x26;logoColor=white&quot; alt=&quot;Astro&quot;&gt;
&lt;img src=&quot;https://img.shields.io/badge/React-18-61DAFB?style=for-the-badge&amp;#x26;logo=react&amp;#x26;logoColor=black&quot; alt=&quot;React&quot;&gt;
&lt;img src=&quot;https://img.shields.io/badge/Cloudflare-Pages%20%2B%20D1-F38020?style=for-the-badge&amp;#x26;logo=cloudflare&amp;#x26;logoColor=white&quot; alt=&quot;Cloudflare&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&quot;We are not filing domains; we are giving digital entities an identity.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一個基於 Cloudflare D1 的去中心化、賽博朋克風格的數字實體檔案庫系統。無服務器架構，邊緣秒級響應。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;🏗️ 1. 項目介紹 (Introduction)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NEBULA.ICP&lt;/strong&gt; 是一個極簡主義、高可視化的模擬 ICP 備案系統。它不僅僅是一個表單，更是一個具有 &lt;strong&gt;賽博朋克/黑客終端&lt;/strong&gt; 美學的數字檔案館。系統摒棄了傳統後台的繁瑣，採用「三要素驗證」機制（域名+備案號+私鑰）實現無賬戶的修改與註銷。&lt;/p&gt;
&lt;h3&gt;👥 作者與維護&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: &lt;a href=&quot;https://github.com/C-4-C-4&quot;&gt;C-4-C-4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;a href=&quot;https://github.com/C-4-C-4/NEBULA-ICP&quot;&gt;NEBULA-ICP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Role&lt;/strong&gt;: Architect / Operator&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🛠️ 技術棧 (Tech Stack)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心框架&lt;/strong&gt;: &lt;a href=&quot;https://astro.build/&quot;&gt;Astro (SSR Mode)&lt;/a&gt; - 極致的渲染性能與服務端渲染能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;交互組件&lt;/strong&gt;: &lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt; - 處理複雜的後台管理、選號大廳、終端模擬動畫。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;樣式庫&lt;/strong&gt;: &lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind CSS&lt;/a&gt; - 快速構建工業機能風、新野獸派佈局。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;數據庫&lt;/strong&gt;: &lt;strong&gt;Cloudflare D1 (SQLite)&lt;/strong&gt; - 運行在邊緣節點的分佈式 SQL 數據庫。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;托管&lt;/strong&gt;: &lt;strong&gt;Cloudflare Pages&lt;/strong&gt; - 全球 CDN 加速與自動化構建。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;鑑權&lt;/strong&gt;: &lt;strong&gt;Admin Session (Cookie)&lt;/strong&gt; + &lt;strong&gt;User Auth Code (Private Key)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;✨ 2. 特色功能與實現原理 (Features)&lt;/h2&gt;
&lt;h3&gt;🖥️ 沉浸式終端 UI (Immersive Terminal UI)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;終端模擬&lt;/strong&gt;: 申請過程包含 4 秒的系統自檢與數據上鏈動畫，拒絕生硬的表單提交。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;無感交互&lt;/strong&gt;: 全站移除原生彈窗 (&lt;code&gt;alert&lt;/code&gt;)，採用自定義的 Toast 通知條與模態框。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;視覺反饋&lt;/strong&gt;: 按鈕具備機械按壓感、懸停光效；列表頁支持隨機洗牌動畫。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🤖 自動化與智能化 (Automation)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自動快照&lt;/strong&gt;: 集成 WordPress mShots 服務，提交域名即刻生成高清網站截圖。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能 Logo&lt;/strong&gt;: 集成 Favicon.im / Iowen API，多級容錯獲取網站圖標，防裂圖處理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防重機制&lt;/strong&gt;: 內置域名查重、備案號防碰撞邏輯。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🔐 選號與安全系統 (Security &amp;#x26; Selection)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;選號大廳&lt;/strong&gt;: 用戶可在 &lt;code&gt;2025&lt;/code&gt; 號段池中搜索心儀的靚號，或使用隨機推薦。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;私鑰驗證&lt;/strong&gt;: 用戶申請成功後獲得唯一 8 位私鑰 (&lt;code&gt;Auth Code&lt;/code&gt;)，憑此碼修改或註銷，無需註冊賬戶。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全風控&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;限流&lt;/strong&gt;: 單 IP 限制 1 小時內提交 6 次。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;黑名單&lt;/strong&gt;: 後台可一鍵拉黑惡意域名，前台提交時自動攔截並提示申訴郵箱。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;⚡ ROOT_CONSOLE 後台 (Admin Panel)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&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;code&gt;Pending&lt;/code&gt; (待審核) 狀態的通過與駁回。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;即時編輯&lt;/strong&gt;: 在卡片內直接翻轉編輯信息（含 Logo/快照/私鑰）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;🚀 3. 部署指南 (Deployment)&lt;/h2&gt;
&lt;p&gt;本項目專為 &lt;strong&gt;Cloudflare Pages&lt;/strong&gt; 設計。請嚴格按照以下步驟操作，&lt;strong&gt;不需要&lt;/strong&gt;傳統服務器。&lt;/p&gt;
&lt;h3&gt;第一步：Fork 倉庫&lt;/h3&gt;
&lt;p&gt;點擊右上角的 &lt;strong&gt;Fork&lt;/strong&gt; 按鈕，將本項目複製到你的 GitHub 賬號下。&lt;/p&gt;
&lt;h3&gt;第二步：準備 Cloudflare D1 數據庫&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;安裝 Wrangler CLI: &lt;code&gt;npm install -g wrangler&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;登錄 Cloudflare: &lt;code&gt;wrangler login&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;創建數據庫: &lt;code&gt;wrangler d1 create icp-db&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;記錄控制台輸出的 &lt;code&gt;database_id&lt;/code&gt;。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;第三步：配置 Cloudflare Pages&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;登錄 &lt;a href=&quot;https://dash.cloudflare.com/&quot;&gt;Cloudflare Dashboard&lt;/a&gt; -&gt; &lt;strong&gt;Workers &amp;#x26; Pages&lt;/strong&gt; -&gt; &lt;strong&gt;Create Application&lt;/strong&gt; -&gt; &lt;strong&gt;Pages&lt;/strong&gt; -&gt; &lt;strong&gt;Connect to Git&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;選擇你的倉庫，配置如下：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Framework preset&lt;/strong&gt;: &lt;code&gt;Astro&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build command&lt;/strong&gt;: &lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output directory&lt;/strong&gt;: &lt;code&gt;dist&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;設置環境變量 (Environment Variables)&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ADMIN_PASSWORD&lt;/code&gt;: 設置你的後台登錄密碼 (例如 &lt;code&gt;nebula-admin-888&lt;/code&gt;)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;第四步：綁定數據庫 &amp;#x26; 初始化&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;部署完成後（第一次可能會失敗，不用管），進入項目 &lt;strong&gt;Settings&lt;/strong&gt; -&gt; &lt;strong&gt;Functions&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;找到 &lt;strong&gt;D1 database bindings&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;點擊 &lt;strong&gt;Add binding&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Variable name&lt;/strong&gt;: &lt;code&gt;DB&lt;/code&gt; (必須是大寫 DB)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D1 database&lt;/strong&gt;: 選擇你在命令行創建的 &lt;code&gt;icp-db&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重新部署&lt;/strong&gt;: 進入 &lt;strong&gt;Deployments&lt;/strong&gt; -&gt; 找到最新一次 -&gt; 點擊 &lt;strong&gt;Retry deployment&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;初始化表結構&lt;/strong&gt;: 在本地終端運行以下命令（將表結構推送到雲端）：
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npx wrangler d1 execute icp-db --remote --file=./db/schema.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;📖 4. 操作手冊 (Operation Manual)&lt;/h2&gt;
&lt;h3&gt;📝 用戶端&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;申請收錄&lt;/strong&gt;: 訪問首頁 -&gt; 填寫信息 -&gt; (可選)去選號大廳選號 -&gt; 提交 -&gt; 獲取 HTML 代碼與私鑰。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查詢檔案&lt;/strong&gt;: 訪問 &lt;code&gt;/archives&lt;/code&gt; -&gt; 瀏覽或搜索。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改/註銷&lt;/strong&gt;: 點擊導航欄 &lt;code&gt;/// 修改&lt;/code&gt; 或 &lt;code&gt;/// 註銷&lt;/code&gt; -&gt; 輸入域名、備案號、私鑰 -&gt; 驗證通過後操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🛡️ 管理端&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;登錄&lt;/strong&gt;: 訪問 &lt;code&gt;/admin&lt;/code&gt; -&gt; 輸入環境變量中設置的密碼。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;審核&lt;/strong&gt;: 在 &lt;code&gt;PENDING&lt;/code&gt; 標籤頁查看待審核項目 -&gt; 點擊 &lt;code&gt;PASS&lt;/code&gt; 或 &lt;code&gt;REJECT&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;黑名單&lt;/strong&gt;: 在 &lt;code&gt;REJECTED&lt;/code&gt; 標籤頁可點擊 &lt;code&gt;UNBAN&lt;/code&gt; 解除封禁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;數據管理&lt;/strong&gt;: 可直接修改用戶的 Logo、快照鏈接，甚至重置用戶的私鑰。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;📊 5. 項目統計 (Statistics)&lt;/h2&gt;
&lt;h3&gt;⭐ Stargazers over time&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://starchart.cc/C-4-C-4/NEBULA-ICP&quot;&gt;&lt;img src=&quot;https://starchart.cc/C-4-C-4/NEBULA-ICP.svg?variant=adaptive&quot; alt=&quot;Stargazers over time&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;⚠️ 免責聲明&lt;/h3&gt;
&lt;p&gt;本項目僅供學習與娛樂使用，生成的「備案號」無法律效力，請勿用於非法用途。美術風格致敬 Project Echo。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;SYSTEM.ADMIN // END_OF_FILE&lt;/strong&gt;&lt;/p&gt;</content:encoded><h:img src="https://img.scdn.io/i/693204c56ba60_1764885701.webp"/><enclosure url="https://img.scdn.io/i/693204c56ba60_1764885701.webp"/></item><item><title>Nebula.ICP 項目</title><link>https://blog.ccomm.top/blog/nebulaicp</link><guid isPermaLink="true">https://blog.ccomm.top/blog/nebulaicp</guid><description>Nebula.ICP 項目界面展示，包含首頁、選號頁、展示頁等，目前項目正在開發中。</description><pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Nebula.ICP 項目&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;目前項目正在開發中&lt;/strong&gt;&lt;/p&gt;
&lt;h6&gt;1、首頁&lt;/h6&gt;</content:encoded><h:img src="https://img.scdn.io/i/6931916423f22_1764856164.webp"/><enclosure url="https://img.scdn.io/i/6931916423f22_1764856164.webp"/></item><item><title>Nebula.SYS 介紹</title><link>https://blog.ccomm.top/blog/nebulasys</link><guid isPermaLink="true">https://blog.ccomm.top/blog/nebulasys</guid><description>一個致敬《明日方舟：終末地》工業機能美學的現代化博客系統。</description><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;🌌 Project Nebula | Nebula Blog System&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/badge/Style-Arknights%3A%20Endfield-FCEE21?style=for-the-badge&amp;#x26;labelColor=000&quot; alt=&quot;Endfield Style&quot;&gt;
&lt;img src=&quot;https://img.shields.io/badge/Next.js-14%2B-black?style=for-the-badge&amp;#x26;logo=next.js&quot; alt=&quot;Next.js&quot;&gt;
&lt;img src=&quot;https://img.shields.io/badge/TypeScript-5.0-blue?style=for-the-badge&amp;#x26;logo=typescript&quot; alt=&quot;TypeScript&quot;&gt;
&lt;img src=&quot;https://img.shields.io/badge/Tailwind-CSS-38B2AC?style=for-the-badge&amp;#x26;logo=tailwind-css&quot; alt=&quot;Tailwind&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&quot;協議已啓動。正在建立安全連接...&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一個致敬《明日方舟：終末地》工業機能美學的現代化博客系統。無需數據庫，基於 Git 的全棧內容管理。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;🏗️ 1. 項目介紹 (Introduction)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Nebula&lt;/strong&gt; 是一個高度定制化的個人博客系統，旨在還原極致的「終末地」UI 風格。它不僅僅是一個靜態頁面，更是一個擁有完整後台管理、3D 可視化交互、終端模擬系統的全棧應用。&lt;/p&gt;
&lt;h3&gt;👥 作者與維護&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Author&lt;/strong&gt;: &lt;a href=&quot;https://github.com/C-4-C-4&quot;&gt;C-4-C-4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;a href=&quot;https://github.com/C-4-C-4/Nebula&quot;&gt;Nebula&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Role&lt;/strong&gt;: Operator / Administrator&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🛠️ 技術棧 (Tech Stack)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心框架&lt;/strong&gt;: &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js 14/15 (App Router)&lt;/a&gt; - 混合渲染 (SSG + SSR)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;樣式庫&lt;/strong&gt;: &lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind CSS&lt;/a&gt; - 極速構建工業風佈局。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;動畫引擎&lt;/strong&gt;: &lt;a href=&quot;https://www.framer.com/motion/&quot;&gt;Framer Motion&lt;/a&gt; - 負責所有 UI 轉場、進入動畫、蟲洞穿越效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3D 引擎&lt;/strong&gt;: &lt;a href=&quot;https://docs.pmnd.rs/react-three-fiber/&quot;&gt;React Three Fiber (Three.js)&lt;/a&gt; - 構建星雲（Nebula）與核心（Core）場景。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;數據層&lt;/strong&gt;: &lt;strong&gt;Git-based CMS&lt;/strong&gt; - 使用 GitHub API 直接讀寫倉庫中的 JSON 和 Markdown 文件，無需傳統數據庫。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;鑑權&lt;/strong&gt;: &lt;strong&gt;Jose (JWT)&lt;/strong&gt; + Middleware - 基於 Edge Runtime 的安全驗證。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;✨ 2. 特色功能與實現原理 (Features)&lt;/h2&gt;
&lt;h3&gt;🖥️ 沉浸式 UI (Immersive UI)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;工業機能風&lt;/strong&gt;: 大量使用細邊框、直角、警示色（#FCEE21）、數據裝飾、毛玻璃效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全屏加載&lt;/strong&gt;: 實現了類似「系統冷啓動」的 CRT 關機/開機動畫，以及「蟲洞穿越」的頁面跳轉特效。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;實現&lt;/strong&gt;: 透過 Framer Motion 的 &lt;code&gt;AnimatePresence&lt;/code&gt; 和全局狀態管理實現無縫轉場。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🌌 3D 星雲可視化 (Nebula Visualization)&lt;/h3&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;strong&gt;可拖拽的 CLI 終端&lt;/strong&gt;。支持 &lt;code&gt;/ls&lt;/code&gt;, &lt;code&gt;/cd&lt;/code&gt;, &lt;code&gt;/sudo&lt;/code&gt; 等指令，甚至可以透過命令行跳轉頁面或登錄後台。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;實現&lt;/strong&gt;: 使用 R3F 的 &lt;code&gt;Canvas&lt;/code&gt; 渲染場景，節點分佈採用斐波那契球算法。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;⚡ Git-based CMS (無數據庫後台)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;: 擁有完整的後台管理界面 (/admin)。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文章管理&lt;/strong&gt;: 增刪改查 Markdown 文章。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置管理&lt;/strong&gt;: 在線修改網站標題、Logo、備案號等，實時生效。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;友鏈管理&lt;/strong&gt;: 自動抓取對方網站 Icon (多級 fallback 機制：iowen -&gt; uomg -&gt; favicon.im)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;實現&lt;/strong&gt;: 利用 &lt;code&gt;Octokit&lt;/code&gt; 調用 GitHub API，將修改後的數據直接 Commit 到倉庫，觸發 Vercel 自動重新構建。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;💬 評論與互動&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Giscus 集成&lt;/strong&gt;: 利用 GitHub Discussions 存儲評論，無縫融入深色主題。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;⭐ Stargazers over time&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://starchart.cc/C-4-C-4/Nebula&quot;&gt;&lt;img src=&quot;https://starchart.cc/C-4-C-4/Nebula.svg?variant=adaptive&quot; alt=&quot;Stargazers over time&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;⚠️ 免責聲明&lt;/h3&gt;
&lt;p&gt;本項目設計靈感來源於《明日方舟：終末地》，僅供學習交流使用。美術素材版權歸鷹角網絡 (Hypergryph) 所有。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Endfield.SYS // CONNECTION_TERMINATED.&lt;/strong&gt;&lt;/p&gt;</content:encoded><h:img src="https://img.scdn.io/i/692dcd265ba3a_1764609318.webp"/><enclosure url="https://img.scdn.io/i/692dcd265ba3a_1764609318.webp"/></item></channel></rss>