架構與工作流程說明書
給研究、編輯與工程夥伴的共同手冊:網站怎麼組成、介面怎麼設計、資料怎麼查證、更新怎麼上傳,以及出問題時怎麼回復。
品質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 成功部署紀錄回復;本機備份還原會覆蓋檔案,應在執行前另行確認。
新版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 年部分月份直接與全年比較。
批次檔上傳
- 編輯並儲存內容,先在本機預覽。
- 雙擊「更新上傳.bat」,以現有 Wrangler 登入檢查檔案。
- 腳本備份本次部署前的網站與版本資訊,再寫入台灣時間。
- 上傳 Cloudflare Pages;遇到錯誤即停止,不宣告成功。
- 開啟 shelter.wen8604.org,核對版本、數據頁與說明書。
快取與回復
頁面採網路優先;拆分的樣式與程式使用必須重新驗證的 HTTP 快取,Service Worker 升級為 msr-v41-20261028。線上更新不必手動清除所有瀏覽器快取。需要回復時,可在 Cloudflare 選擇前一次成功部署;本機還原涉及覆蓋,應先確認欲回復的備份。
01產品定位與邊界
這個網站是什麼、不是什麼
提供可查證的移工安置制度與機構研究索引,回答「誰設立、誰承接、誰出錢、誰監督」。它不是即時庇護所名錄,也不是緊急轉介入口。
- 區分一般臨時安置、人口販運庇護、駐台代表處安置、婦幼特殊安置與仲介住宿,不虛構全國總數。
- 歷史安置紀錄不等於現在仍在營運或持有政府契約。
- 不收集個資、不提供上傳、不公開受庇護者非公開位置。
02系統架構
靜態頁面+邊緣函式+鍵值儲存
| 檔案 | 角色 |
|---|---|
site/index.html | 主網站內容、SVG 圖示與插圖;CSS 與 JavaScript 拆成同站資源。 |
site/docs.html | 本說明書,共用同一套設計代號與友善模式設定。 |
site/_headers | Cloudflare 安全標頭(CSP、HSTS、X-Frame-Options 等)與快取規則。 |
site/version.json | 部署時自動寫入的版本與更新時間。 |
functions/api/visit.js | 獨立訪客統計 API。 |
wrangler.toml | Pages 專案名稱、輸出資料夾、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)
內文對比 ≥ 4.5:1;金色只用於深色底或當底色配黑字。插圖顏色全部以 CSS 變數控制,深色模式自動轉為夜景(月亮、星星、窗戶亮燈)。
三種裝置版型
底部五格分頁列(拇指可及),「更多」以底部抽屜開啟;設定面板也從下方滑出;表格改為卡片式。
頂部列下方加一排可橫向滑動的分頁膠囊,目前分頁自動置中;卡片兩欄。
頂部分頁列帶滑動指示器;卡片三欄;時間軸右側固定地圖說明。
友善模式細部設定
| 項目 | 選項 | 效果 |
|---|---|---|
| 友善模式總開關 | 開/關 | 字級 ×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,獨立計算、不追蹤個人
- 頁面載入後閒置時:若是本工作階段第一次造訪送
POST /api/visit,之後只送GET讀取。 - 邊緣函式判斷:排除爬蟲、無頭瀏覽器與 Cloudflare 判定的機器人;拒絕跨網域 POST。
- 去重:以「IP+瀏覽器+日期+鹽」做 SHA-256,存 48 小時後自動刪除;同一人同一天只算一次。
- 累加:
total與d:YYYY-MM-DD兩個計數器各加一,回傳累計與今日人次。 - 顯示:頁尾「累計造訪 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內容採證工作流程
從提案到勘誤的八個步驟
- 提案:建立待查問題,明確統計期間與定義。
- 取證:法規、標案、審計報告、官方年報優先;保存網址、發布日、擷取日。
- 分級:官方直接證實/歷史有據/尚待驗證/已更正/已撤回。
- 核對:高風險資訊至少兩位編輯交叉覆核;涉及機構聲譽須給予回應機會。
- 去重:依法人識別碼、設施識別碼、契約案號與年度比對。
- 審核:法規適用、統計單位、推論限制、個資遮蔽、中性用詞與來源連結。
- 發布:更新資料陣列 → 執行
deploy.ps1,自動記錄更新時間與摘要。 - 勘誤:公布錯誤位置、來源與更正日期;不默默改寫重要結論。
09更新上傳流程(Cloudflare)
第一次設定與日常更新
第一次設定(約 5 分鐘)
- 安裝 Node.js LTS(nodejs.org)。
- 雙擊
deploy.bat。第一次會開啟瀏覽器,請登入 Cloudflare 並按「Allow」授權。 - 腳本會自動建立 KV「VISITS」、填入
wrangler.toml、建立 Pages 專案migrant-shelter-research並上傳。 - 完成後網址為
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 相同的統計函式模擬執行;外部政府網站連結因測試環境無法連外,需上線後人工點開確認。