Hamdy Tabsissi
繁體中文

Mindmap 正式上線 個人專案

盡情探索想法,始終不會迷失方向

一個小星球造型的心智圖:打開一則筆記,它的子筆記就會出現在周圍,同時整體全貌依然看得見。

需求

在多數心智圖工具中,展開一個分支不是讓畫面變得雜亂,就是跳到新的頁面——結果就忘了自己是從哪裡來的。

構想

完全保留傳統的想法樹狀結構——只改變在其中移動的方式。

我打造了什麼

  • 一種導覽方式:每則筆記的子筆記會出現在它周圍的小球面上,而上一層仍留在螢幕上。
  • 以舒適為優先挑選的操作:滾輪縮放、拖曳旋轉、Alt + 拖曳移動視角,手機上則有更大的觸控區域。
  • 先前的兩個版本——一個平面圖,以及每次點擊都會切換場景的 3D 版本——因為容易讓人失去方向感而被取代。
  • 它也會透過一個小型公開資料來源,自動把本網站的專案呈現在地圖上。

成果

  • 3試過的導覽設計,保留 1 種
  • 22次試圖繞過編輯保護——全部被擋下
  • 2整個專案的相依套件數
  • 2026 年 9 月 5 日上線日期

公開的心智圖就是這套導覽方式的實際示範。任何修改都必須先通過自動化測試,才會更新到正式環境。

畫面一覽

上線中的 Mindmap:星空背景上的線框地球儀,以及兩則發光的筆記——「Bienvenue」和「Sur le site」,後者是呈現本網站專案的分支
上線中的 Mindmap:星空背景上的線框地球儀,以及兩則發光的筆記——「Bienvenue」和「Sur le site」,後者是呈現本網站專案的分支

我學到了什麼

三個版本之間,資料幾乎沒有改變——改變的只有在其中移動的方式。把兩者分開,讓我能把畫面呈現重做兩次,卻完全不必動到資料。

技術細節 技術堆疊、架構與決策——給技術背景的讀者

技術堆疊

  • Three.js
  • 原生 JavaScript
  • Node.js + Express
  • SQLite (node:sqlite)
  • Cloudflare Tunnel + Access
  • systemd
  • GitHub Actions

運作方式

  • 單一遞迴資料表 notes(id, parent_id, x, y, title, content),其中 x 和 y 是父筆記球面上的經度與緯度(以度為單位)。
  • Three.js 是瀏覽器載入的唯一函式庫;約 760 行自行撰寫的 JavaScript 負責版面配置、導覽與編輯。攝影機直接控制球面座標,而不是使用 OrbitControls。
  • 每個子球體的半徑為父球體的 0.46 倍;導覽過程中從不重建場景圖(scene graph)。
  • 讀取公開;寫入則在上游由 Cloudflare Access 把關,服務本身只在通道後方的 127.0.0.1 上監聽。22 次繞過嘗試(大小寫變換、雙斜線、「..」路徑片段、URL 編碼、其他 HTTP 方法)全都被導向登入頁面。
  • 一次以攻擊者角度進行的審查發現了兩個真正的缺陷,並在當天修正:掛載在所有路由上的 JSON 解析器,讓匿名訪客能寫入系統日誌;以及只要一次網路載入失敗,就會讓導覽卡住。
  • 透過 GitHub Actions 持續部署;只有測試套件全部通過,正式環境才會更新。

事件與修正

  • 在手機上,點擊小小的筆記標記(6 到 10 px)常常點不中:加入 22 px 的觸控容錯範圍,並預先載入下一層之後,模擬點擊的成功次數從 12/17 提升到 17/17。
  • 光暈效果(bloom)是手機上的效能瓶頸:在手機上關閉它之後,跨越多個層級的飛行動畫從每秒 20 個影格提升到 37 個影格。

仍待補強

  • 編輯權限僅限本人——刻意如此設計
  • 觸控手勢仍在調整中