說明書回到研究平台
架構與工作流程 · v4.1

架構與工作流程說明書

給研究、編輯與工程夥伴的共同手冊:網站怎麼組成、介面怎麼設計、資料怎麼查證、更新怎麼上傳,以及出問題時怎麼回復。

最後更新 適用:網站 v4.1驗證結果請參閱本版測試報告部署:Cloudflare Pages
0新增正式前端套件依賴
依實測記錄傳輸大小記錄於本版測試報告
3手機、平板、桌機測試尺寸
5官方統計圖表(附數據表)
品質

v4.1 產品檢查與修復紀錄

資安、操作、內容與維護邊界

問題與修復

問題改善方式驗證方式
API 的來源解析與儲存例外可能中斷回應精確比對來源、拒絕缺少來源的寫入、回傳可控 403/503、附上 API 自身安全標頭異常來源、缺少 KV、儲存失敗測試
腳本政策允許任意行內程式移除 script-src 的 unsafe-inline,初始設定程式使用 SHA-256 白名單;說明書互動移到同站檔案核對雜湊、測試注入程式被阻擋及原功能可用
快取可能保存錯誤頁面,或用 HTML 回覆腳本請求僅保存成功回應;API 排除;離線缺少資源時回覆 503;伺服器錯誤時優先使用既有成功快取離線、404/503 回應及缺少資源測試
快速導覽、連點收合與空搜尋狀態不穩定跳過前一個轉場;收合交給原生 details;清除失效的選取標記;搜尋機構時解除衝突篩選快速操作、鍵盤及搜尋回歸測試
本機顯示設定可能損壞或超出範圍字級、主題、行距及布林值採允許清單;只讀取支援欄位異常 JSON 與不合法設定值測試
訪客統計容易被誤認為精確人數改標示約略造訪次數,說明去重與併發限制;請求成功後才保存工作階段標記失敗重試與計數格式測試
插畫不夠細膩,真實感又可能造成誤認使用內建圖片生成工具製作寫實情境插畫,加入 AI 示意註記、替代文字及三尺寸 WebP視覺檢查、圖片載入、比例與尺寸測試

資料補強與來源

新增研究路徑、安置與解除安置差異、機構委託查證步驟、臨時安置概念流程及引用原則。法律流程以勞動部作業要點為依據;103 人的公告來源為移民署 2026 研討會公告。機構卡片額外顯示證據能支持的範圍;未逐筆確認所有現行契約。

系統邊界與尚存風險

  • KV 為最終一致儲存,並行讀取後加一可能互相覆蓋;本版未改用新資料庫,統計仍是約略值,不能用於稽核、請款或精確人數報告。
  • 來源檢查與機器人字串不是完整的流量防護;蓄意偽造請求仍需 Cloudflare 平台流量控管。未以此宣稱通過正式滲透測試。
  • 正式站設定獨立隨機 VISIT_SALT,值不存入專案與前端;缺少此值時停止新增計數。雜湊是短期假名化資料,不等於完全匿名;應用程式不將原始 IP 存入 KV,託管業者仍處理連線資訊。
  • script-src 已限制行內程式;為保留圖表與設定的動態樣式,style-src 仍允許行內樣式。
  • 本機自動化與裝置尺寸模擬不能取代實體裝置、Safari、輔助科技、真實網路及長期負載測試。

維護檔案

新增 assets/refinement.v41.css、assets/docs.v41.js 及 hero-v41-640/960/1440.webp。既有 app.v4.js 檔名保留以維持工具相容,實際產品版本以 version.json 與部署記錄為準。不要只複製首頁,必須整包部署。

發布與回復流程

先基本檢查 → 本機回歸 → 資安與離線情境 → 人工視覺檢查 → 備份 → 批次部署 → 正式站核對。需要回復時先確認版本,再使用 Cloudflare 成功部署紀錄回復;本機備份還原會覆蓋檔案,應在執行前另行確認。

技術依據:Cloudflare KV 寫入與併發限制、Pages 安全標頭、CSP 原則。

新版

v4.1 改版與維護指南

研究入口、分層閱讀、專業分析與安全部署

設計目標

以細緻寫實的情境插畫搭配編輯式排版,讓讀者先找到研究方向,再按需要展開文章。原有七個分頁、搜尋、下載、友善模式及訪客統計皆保留。

架構與檔案

檔案維護用途
index.html內容、圖示與延後建立的分頁範本;寫實插畫使用響應式 WebP
assets/base.v4.css基礎樣式、深色、高對比與列印
assets/design.v4.css新版視覺、三種裝置版面、分析摘要
assets/app.v4.js原始資料、搜尋、路由、圖表與計算摘要
functions/api/visit.js訪客統計;部署時必須與 site 同層保留

閱讀流程

首頁研究入口 → 選擇數據、機構或法規 → 篩選主題 → 展開文章/原始數據表 → 核對來源。首頁深入內容預設收合,搜尋結果會連同外層文章一起展開;列印時也會自動展開並在結束後恢復。

圖表分析原則

五張互動圖表依「移工規模」「被害人保護」切換。2025 年底規模、年度增加、十年變化與許可失效占比均從同一份原始陣列計算。年增率=(本年/上年-1)×100%;許可失效占比=(總計-產業有效許可-社福有效許可)/總計。數值不代表安置需求,也不把 2026 年部分月份直接與全年比較。

批次檔上傳

  1. 編輯並儲存內容,先在本機預覽。
  2. 雙擊「更新上傳.bat」,以現有 Wrangler 登入檢查檔案。
  3. 腳本備份本次部署前的網站與版本資訊,再寫入台灣時間。
  4. 上傳 Cloudflare Pages;遇到錯誤即停止,不宣告成功。
  5. 開啟 shelter.wen8604.org,核對版本、數據頁與說明書。

快取與回復

頁面採網路優先;拆分的樣式與程式使用必須重新驗證的 HTTP 快取,Service Worker 升級為 msr-v41-20261028。線上更新不必手動清除所有瀏覽器快取。需要回復時,可在 Cloudflare 選擇前一次成功部署;本機還原涉及覆蓋,應先確認欲回復的備份。

01

產品定位與邊界

這個網站是什麼、不是什麼

提供可查證的移工安置制度與機構研究索引,回答「誰設立、誰承接、誰出錢、誰監督」。它不是即時庇護所名錄,也不是緊急轉介入口。

  • 區分一般臨時安置、人口販運庇護、駐台代表處安置、婦幼特殊安置與仲介住宿,不虛構全國總數。
  • 歷史安置紀錄不等於現在仍在營運或持有政府契約。
  • 不收集個資、不提供上傳、不公開受庇護者非公開位置。
02

系統架構

靜態頁面+邊緣函式+鍵值儲存
使用者瀏覽器 手機/平板/桌機 localStorage 存設定 Cloudflare 邊緣網路 Pages 靜態託管 index.html · docs.html · _headers Pages Functions /api/visit 排除機器人+去重 Workers KV「VISITS」 total · d:日期 · u:雜湊(48h) deploy.ps1(本機) 寫入更新時間 → wrangler 上傳 HTTPS 統計
檔案角色
site/index.html主網站內容、SVG 圖示與插圖;CSS 與 JavaScript 拆成同站資源。
site/docs.html本說明書,共用同一套設計代號與友善模式設定。
site/_headersCloudflare 安全標頭(CSP、HSTS、X-Frame-Options 等)與快取規則。
site/version.json部署時自動寫入的版本與更新時間。
functions/api/visit.js獨立訪客統計 API。
wrangler.tomlPages 專案名稱、輸出資料夾、KV 綁定。
deploy.ps1/deploy.bat一鍵更新上傳;preview.bat 用於本機預覽(含統計函式)。
03

前端模組

單頁分頁式應用,切換不重新載入
路由與分頁

以 #/data 這類網址切換七個分頁;首頁以外的分頁內容放在 <template>,第一次開啟才建立(首屏 DOM 從 1,878 降到 967 個節點);支援上一頁、舊網址轉址與 View Transitions 淡入。

設定模組

深色模式與友善模式;設定存於 wen8604.a11y.v1,與 wen8604 網站群共用;head 內先套用避免閃爍。

資料庫模組

關鍵字(120ms 防抖)、類型篩選膠囊、證據狀態下拉、卡片展開、CSV 匯出(含公式注入防護)。

收合模組

所有文章段落可收合,展開/收合有高度動畫,每區提供「全部展開/全部收合」。

統計模組

每個瀏覽工作階段只計一次;失敗或本機開啟時整塊隱藏,不顯示 0。

全站搜尋

按 Ctrl+K 或 / 開啟,可搜分頁、機構、來源、文章段落與圖表,方向鍵選擇、Enter 直接跳到該段並展開。

離線快取

Service Worker:頁面網路優先(更新立即生效)、其他檔案快取優先;第二次造訪幾乎瞬開,斷網也能閱讀。

更新時間

讀取 <meta name="build-time">,以台灣時間顯示在首頁與頁尾,由部署腳本自動改寫。

04

介面設計系統

配色、字體、三種裝置版型、深色與友善模式

配色(依 wen8604 設計規範 v1.0)

主色 #1D6B5F
輔色 #0B4A6B
強調 #C2410C
金 #F2B544
底色 #F7F5EF
深色底 #0E1522

內文對比 ≥ 4.5:1;金色只用於深色底或當底色配黑字。插圖顏色全部以 CSS 變數控制,深色模式自動轉為夜景(月亮、星星、窗戶亮燈)。

三種裝置版型

手機 < 640px

底部五格分頁列(拇指可及),「更多」以底部抽屜開啟;設定面板也從下方滑出;表格改為卡片式。

平板 640–1079px

頂部列下方加一排可橫向滑動的分頁膠囊,目前分頁自動置中;卡片兩欄。

桌機 ≥ 1080px

頂部分頁列帶滑動指示器;卡片三欄;時間軸右側固定地圖說明。

友善模式細部設定

項目選項效果
友善模式總開關開/關字級 ×1.25、行距寬鬆、按鈕 ≥ 48px、連結底線、強化焦點框(可再個別微調)
外觀主題淺色/深色/跟隨系統頂部也有一鍵切換按鈕
文字大小標準/大/特大/超大100%/112.5%/125%/150%,全站以 rem 等比放大
行距標準/寬鬆/加寬1.75/1.9/2.1
高對比開/關底 #10212C、字 #E8F1F5(14.4:1)、連結 #F2B544
減少動態開/關關閉轉場、插圖漂浮與收合動畫;也自動遵循系統設定
加寬字距開/關字距 +0.06em
連結加底線/強化焦點框開/關不靠顏色辨識連結;鍵盤焦點加粗並加光暈
05

載入速度策略

為什麼這麼快
  • 內容 HTML、同站 CSS 與 JavaScript 分離;不請求第三方字型或套件,使用系統中文字型。
  • 圖示改為內嵌 SVG sprite(<symbol> + <use>),插圖為向量,不需載入任何圖片。
  • 分頁切換只切換顯示,不重新請求;資料卡片用 DocumentFragment 式建立,搜尋加防抖。
  • 訪客統計延後到瀏覽器閒置時才呼叫(requestIdleCallback),不影響首屏。
  • Cloudflare 自動 Brotli 壓縮、HTTP/3 與全球節點;HTML 每次重新驗證,確保更新立即生效。
  • 非首頁分頁延遲建立、裝飾動畫延後到頁面穩定才啟動,首屏不搶主執行緒。
  • 首屏依網址先顯示對應分頁,避免版面跳動(CLS 0)。
  • 舊版 Lighthouse 數字不沿用至本版;本版以實測報告為準。
06

訪客統計與更新時間

Cloudflare Functions+KV,獨立計算、不追蹤個人
  1. 頁面載入後閒置時:若是本工作階段第一次造訪送 POST /api/visit,之後只送 GET 讀取。
  2. 邊緣函式判斷:排除爬蟲、無頭瀏覽器與 Cloudflare 判定的機器人;拒絕跨網域 POST。
  3. 去重:以「IP+瀏覽器+日期+鹽」做 SHA-256,存 48 小時後自動刪除;同一人同一天只算一次。
  4. 累加:total 與 d:YYYY-MM-DD 兩個計數器各加一,回傳累計與今日人次。
  5. 顯示:頁尾「累計造訪 N 人次・今日 n」;若 API 失敗或數字為 0,整塊隱藏。

KV 為最終一致性儲存,極短時間內大量同時造訪可能少算幾筆;研究網站流量下影響可忽略。若未來需要精確到每一筆,可改用 D1(SQL 原子遞增)或 Durable Objects。

更新時間:每次執行 deploy.ps1 會把當下時間寫入兩個頁面的 build-time 與 version.json,並在 deploy-log.txt 記一筆。

07

資料模型

下一版建議拆成獨立 JSON
{
  "id": "organization-001",
  "name": "組織名稱",
  "category": "government | shelter | education",
  "shelter_contract_status": "documented | unverified",
  "description": "已查得服務與限制",
  "source_ids": ["S01"],
  "reference_year": 2022,
  "last_verified_at": "2026-10-27",
  "operating_status": "unknown",
  "reviewer": "待指派",
  "revision_notes": "需取得正式函覆"
}

同一團體可有多種服務類型;正式資料庫應以多對多關聯表(organizations、services、facilities、contracts、grants、evidence、revisions)處理。設施與法人分開,避免重複計算。

08

內容採證工作流程

從提案到勘誤的八個步驟
  1. 提案:建立待查問題,明確統計期間與定義。
  2. 取證:法規、標案、審計報告、官方年報優先;保存網址、發布日、擷取日。
  3. 分級:官方直接證實/歷史有據/尚待驗證/已更正/已撤回。
  4. 核對:高風險資訊至少兩位編輯交叉覆核;涉及機構聲譽須給予回應機會。
  5. 去重:依法人識別碼、設施識別碼、契約案號與年度比對。
  6. 審核:法規適用、統計單位、推論限制、個資遮蔽、中性用詞與來源連結。
  7. 發布:更新資料陣列 → 執行 deploy.ps1,自動記錄更新時間與摘要。
  8. 勘誤:公布錯誤位置、來源與更正日期;不默默改寫重要結論。
09

更新上傳流程(Cloudflare)

第一次設定與日常更新

第一次設定(約 5 分鐘)

  1. 安裝 Node.js LTS(nodejs.org)。
  2. 雙擊 deploy.bat。第一次會開啟瀏覽器,請登入 Cloudflare 並按「Allow」授權。
  3. 腳本會自動建立 KV「VISITS」、填入 wrangler.toml、建立 Pages 專案 migrant-shelter-research 並上傳。
  4. 完成後網址為 https://migrant-shelter-research.pages.dev;可在 Cloudflare 後台 Pages → 自訂網域 綁定自己的網域。

日常更新

# 1. 修改 site\assets\app.v4.js 內的資料陣列,或 index.html 的文章文字
# 2. 本機預覽(含統計 API)
preview.bat                      # 開啟 http://localhost:8788
# 3. 上傳(可附更新說明)
.\deploy.ps1 -Message "新增 2026 年勞動部安置名冊"

回復上一版

Cloudflare 後台 → Workers & Pages → 本專案 → 部署 → 找到上一個成功版本 →「Rollback to this deployment」,生效時間依 Cloudflare 狀態而定;KV 歷史值保留,但不同版本的去重方式可能影響約略統計。

部署只需要 Cloudflare 帳號授權,不需要在檔案裡寫任何密碼或 API 金鑰。若改由 CI 自動部署,請把 CLOUDFLARE_API_TOKEN 設為 CI 的祕密變數(權限只給 Pages 編輯與 Workers KV 編輯)。

10

安全與隱私

威脅模型與對策
潛在問題目前對策後續強化
XSS 注入動態資料一律以 textContent/DOM 節點建立script-src 已移除 unsafe-inline;動態樣式仍保留 style-src unsafe-inline
供應鏈零外部套件、零 CDN若引入套件需鎖版本並掃描
點擊劫持、嗅探_headers:X-Frame-Options DENY、nosniff、frame-ancestors 'none'—
傳輸安全Cloudflare 全站 HTTPS+HSTS網域加入 HSTS preload
統計灌水排除機器人、拒絕跨網域 POST、每人每日一次開啟 Cloudflare Bot Fight Mode/Turnstile
個資不存 IP,只存 48 小時的加鹽雜湊;無 Cookie設定 VISIT_SALT 祕密變數
惡意 CSV 公式以 = + - @ 開頭的欄位前加單引號匯出自動化測試
誹謗/不當推論未證實一律標「待查」,不作犯罪指控法務與事實查核審閱、申訴管道
11

驗收清單

v4.1 完成項目與待辦
  • 六分頁單頁應用、滑順切換、舊網址相容
  • 手機底部列/平板滑動分頁/桌機分頁指示器
  • 重新繪製的主視覺插圖(串燈、窗台花、門牌、盆栽)、分頁插圖與 47 個圖示,深色模式夜景
  • 文章與說明全面可收合,含全部展開/收合
  • 深色模式+友善模式 8 項細部設定,跨站共用設定
  • 網站更新時間自動寫入、獨立訪客統計(排除機器人)
  • Cloudflare 安全標頭、一鍵部署、本機預覽
  • v3:數據分析分頁 5 張官方統計圖表、全站搜尋、離線快取、閱讀進度條
  • v3:自動化測試 209 項(3 種裝置 × 淺/深色),axe 無障礙無嚴重問題
  • 全台政府安置名冊與委託契約逐筆去重
  • 機構狀態正式函覆、印尼據點精確開設日期
  • 真機 WCAG 2.2 AA 稽核與螢幕閱讀器實測
  • 公開勘誤紀錄頁與資料版本差異
12

下一版路線與維護角色

優先順序與分工
優先項目
P0來源連結自動檢查(排程 Worker)、法規與數據證據綁定、對外勘誤流程
P1資料拆為獨立 JSON、版本管理、公開 CSV/JSON API
P2政府標案與補助資料交叉索引、分年度趨勢圖、雙語(中/印尼文)介面
P3需身分驗證的內容管理後台(Cloudflare Access 保護、操作稽核、備份)

角色:資料研究員收集來源;主編審核推論與措辭;法務/資安審查敏感內容;工程師管理程式、部署、備份與監測。任何人都不應在缺乏原始資料時自行更改數字或指控機構。

13

數據分析與圖表規範

資料來源、圖表設計、可近用性
圖表型式資料來源
2015–2025 在臺移工人數堆疊直條(產業/社福/許可失效)勞動部勞動力發展署 表 13-2
聘僱許可失效人數折線+淡面積,標示最低點與最新值同上(總計減有效許可)
國籍與性別水平堆疊長條勞動部性別勞動統計分析(2024 年底)
人口販運被害人解除安置堆疊直條(移民署/勞動部/衛福部)移民署月報表 113–115 年
2025 年每月解除安置直條,強調高峰月份移民署 114 年月報表

設計規則

  • 標題就是結論:例如「十年增加 27.8 萬人」,副標說明範圍與單位。
  • 配色經驗證:類別色 #13846D/#D45F28/#3473BD(深色 #24A086/#E2703A/#4D8FD8)通過色盲分離、亮度帶與 3:1 對比檢查;「許可失效」用灰色退居背景。
  • 細線與留白:直條最寬 24px、頂端 4px 圓角、堆疊間 2px 間隙;格線為實線細線;只標重點數值,不在每個點上寫數字。
  • 不使用雙 Y 軸:人數與占比分開呈現(占比放在提示框與數據表)。
  • 互動不設門檻:滑鼠、觸控、鍵盤(Tab 進入、左右鍵逐年)都能看提示框;每張圖都有「顯示數據表」。
  • 純 SVG 自繪:不載入圖表套件,寬度改變才重繪,切換深色模式自動換色。

更新數據:修改 index.html 內的 YEARS/TOTAL/IND/SOC/NATION/AGENCY/MONTH25 陣列,同步更新圖表標題中的結論數字,再執行 deploy.bat。

14

測試報告

2026-10-28 自動化測試結果
測試類別內容結果
分頁與版面手機 390/平板 820/桌機 1440 × 淺色/深色,7 個分頁以實際選單逐一切換,檢查無橫向捲動通過
無障礙(axe-core 4.10)WCAG 2.0/2.1 A、AA 與最佳做法;含高對比+超大字級與說明書無嚴重問題
圖表5 張圖產生、滑鼠提示框、數據表切換、鍵盤左右鍵操作通過
資料庫關鍵字搜尋、類型篩選、卡片展開、CSV 匯出(含 BOM、12 列)、空結果通過
收合全部展開、全部收合、單篇動畫展開通過
友善模式總開關(20px)、高對比、超大字級(24px)、重新整理後保留、恢復預設通過
導覽Ctrl+K 全站搜尋跳轉、瀏覽器上一頁、舊網址轉址、Tab 第一站為「跳至主要內容」通過
訪客統計一般訪客計入並顯示、同日同訪客只計一次、無頭瀏覽器不計入通過
Lighthouse 12歷史版本測試;v4.1 未重新執行 Lighthouse本版未執行

既有回歸套件包含 209 項自動化檢查,本版結果請見測試報告。測試在本機以與 Cloudflare 相同的統計函式模擬執行;外部政府網站連結因測試環境無法連外,需上線後人工點開確認。