依 SCAICT 證書編號標準規範 第 14 條建立的證書查驗網站,部署於 verify.scaict.org。
輸入或掃描證書上的查驗連結 https://verify.scaict.org/{certificate_no}/,
即可查詢該證書的類別、發證日期、狀態(有效/已作廢/已補發),並以遮罩姓名
(如「王○明」)呈現持有人,不會顯示完整姓名。
- Astro(
output: 'static'):建置時透過getStaticPaths()依登記簿每一列 資料各自產生一頁純靜態 HTML,網址即為/{certificate_no}/,不需要任何 client-side 路由技巧或查詢字串。 - 資料來源:Google 試算表:建置時以 Service Account 直接讀取試算表登記簿
(對應附錄 B 欄位),在讀到資料的當下就完成姓名遮罩、並捨棄
activity_name/remark/serial等不應公開的欄位,未遮罩的完整姓名 不會寫入任何建置產物或 git 記錄。 - 部署:GitHub Pages(本 repo 自己的 Pages,非 SCAICT.github.io),透過
.github/workflows/deploy.yml建置後部署,並用public/CNAME指定verify.scaict.org這個自訂網域。
- 到 Google Cloud Console 建立(或使用既有)專案, 啟用 Google Sheets API,並建立一組 Service Account,下載其 JSON 金鑰。
- 將登記簿試算表分享給該 Service Account 的信箱(
xxx@xxx.iam.gserviceaccount.com), 權限設為「檢視者」即可(唯讀,不需要編輯權限)。 - 在本 repo 的 GitHub Settings → Secrets and variables → Actions 新增:
GOOGLE_SHEET_ID:試算表網址中/d/與/edit之間的那段 IDGOOGLE_SERVICE_ACCOUNT_KEY:下載的整份 JSON 金鑰內容(原封不動貼上)- (選填)Repository variable
GOOGLE_SHEET_RANGE:分頁名稱與範圍, 預設為登記簿!A:I,對應附錄 B 欄位順序certificate_no, type_code, roc_year, serial, holder_name, activity_name, issued_date, status, remark。
- 未設定上述 Secrets 時(例如本機開發),會自動改用
src/lib/sampleData.ts的範例資料建置, 方便在沒有憑證的情況下也能跑pnpm dev/pnpm build。
在 scaict.org 的 DNS 設定(例如 Cloudflare)新增一筆:
CNAME verify SCAICT.github.io
並在本 repo 的 GitHub Settings → Pages 確認 Custom domain 已顯示為
verify.scaict.org 且 HTTPS 憑證已核發完成(public/CNAME 檔案會在部署後
由 GitHub Pages 自動讀取設定,但第一次仍需等待 DNS 生效與憑證簽發)。
- 每次 push 到
main。 - 排程:每 6 小時自動重建一次,讓試算表的異動(新發證、作廢、補發) 不需要人工介入就能反映到網站上。
- 手動:GitHub Actions 頁面對
Build and deploy verify site按Run workflow,適合剛核發完證書、想立刻更新的情況。
pnpm install
pnpm dev # http://localhost:4321
pnpm build # 產出 ./dist
pnpm preview # 本機預覽建置結果見 src/lib/mask.ts:3 字以上姓名保留首尾、中間以單一
「○」取代(如「王小明」→「王○明」);2 字姓名保留姓氏、名字整個遮罩;
1 字姓名完全遮罩。1、2 字的規則為本專案延伸定義,證書標準原文僅示範 3 字姓名。
- Google 試算表 ID、分頁名稱與實際欄位是否與附錄 B 完全一致,需行政組確認。
- 排程重建頻率(目前預設每 6 小時)可依實際發證頻率調整。
- 「補發後連結至最新編號」為本專案依
-r{n}後綴慣例推論出的加強功能, 非規範明文要求,如不需要可移除src/lib/certificates.ts中相關邏輯。