跳至主要內容

NAPAICP 平台管理操作手冊

管理平台帳號、跨競賽治理、權限與安全操作的完整手冊。內容依現行系統實際畫面與操作行為撰寫。

本頁目錄

0. 總覽與適用對象

本手冊說明如何操作 NAPAICP(一個管理團隊、作品繳交、評審與結果的多競賽平台)的兩層管理介面:平台管理主控台(/platform,僅 super_admin 可進入)與單一競賽管理介面(/admin/competitions/:id,competition_admin 與部分 staff 可進入)。內容依現行系統實際畫面與操作行為撰寫。

適用對象

平台超級管理員(Super Admin)、競賽主辦方管理員(Competition Admin)、協助競賽營運的 Staff。

重要原則

畫面上顯示或隱藏某個按鈕只是 UX 提示,不是安全邊界,所有授權判斷最終都在伺服器端重新驗證。管理員操作的每一個高敏感動作都會寫入稽核紀錄且無法刪除。

1. 角色與權限模型

NAPAICP 有兩層角色,彼此分離,不可互相取代:

層級角色說明
平台級(Global)super_admin跨所有競賽的治理權限,儲存在 users.global_role。授予/撤銷只能透過「平台管理員」頁面,且系統任何時候都必須至少保留一位啟用中的 super_admin(最後管理員保護)。
競賽級(Competition-scoped)competition_admin單一競賽的主辦管理員,可管理該競賽的排程、表單、隊伍、評審、評分規準、結果與稽核。
staff協助營運的工作人員,權限依頁面設定(部分頁面對 staff 開放唯讀或部分操作)。
teacher指導老師,隨隊伍設定。
student參賽學生。
judge評審,透過評審邀請流程加入該競賽。
observer唯讀觀察者。

同一個使用者帳號可以在「甲競賽」是評審、在「乙競賽」是學生,競賽角色永遠以使用者 × 競賽為單位存在(權威資料表 competition_roles),不會從全平台角色摘要反推。

最低平台權限清單

platform.dashboard.read、platform.users.read/manage、platform.memberships.read/manage、platform.judges.read/manage、platform.admins.read/manage、platform.audit.read、platform.operations.read。super_admin 預設持有全部。

2. 帳號、登入與 Bootstrap

2.1. 一般登入

管理員以一般帳號密碼或 OIDC 登入。Session 預設閒置 12 小時、絕對效期 7 天過期;密碼採版本化 PBKDF2-HMAC-SHA256 雜湊,D1 只保存雜湊值,永不保存明文。

2.2. 首位 Super Admin Bootstrap(僅限全新部署)

全新部署時系統沒有任何 super_admin,不會因為誰第一個註冊就自動取得權限(避免搶占接管)。正確流程:

  1. 部署負責人透過 Deployment Secret 設定一次性 Bootstrap Credential(不寫入 Git、前端 bundle 或任何 log)。
  2. 平台負責人以正常流程註冊帳號並完成 Email 驗證。
  3. 登入後直接前往 /bootstrap(此頁面刻意不出現在任何導覽選單或帳號選單中,只能直接輸入網址進入),輸入 Bootstrap Credential 送出。
  4. 伺服器驗證 session、Email 已驗證、帳號啟用中、目前啟用中 Super Admin 數量為 0、credential 有效且尚未使用,才會以並發安全(concurrency-safe)交易授予第一位 super_admin,並寫入 INITIAL_SUPER_ADMIN_BOOTSTRAP 稽核紀錄。
  5. Credential 立即失效/消耗;之後任何 Bootstrap 請求一律失敗(fail closed),即使已有 Super Admin 也不能重新 Bootstrap。

之後所有新的 super_admin 一律只能透過「平台管理員」頁面(3.5)由現任管理員授予。

禁止事項

不得以「第一個註冊者自動成為管理員」替代此流程;不得把 Bootstrap Secret 寫入程式碼或分享於 Slack/Email;不得在已有啟用中 Super Admin 時重新 Bootstrap;不得用直接手改 production 資料庫的方式產生管理員。

2.3. 忘記密碼

一般使用者(含管理員)可透過忘記密碼 → 重設密碼自助重設密碼。重設成功後既有 session 會被撤銷。

3. 平台管理主控台

路徑 /platform,僅 super_admin 可見。此區塊不是第二套使用者/競賽/評審主資料,它是對權威資料(users、competitions、competition_roles、評審關係、audit_logs)的跨競賽治理視圖與操作入口。左側導覽依序為:總覽、使用者、競賽人員、評審、管理員、稽核。

3.1. 總覽(Dashboard)

顯示啟用中使用者數、已停權使用者數、競賽總數、進行中競賽數、評審關係數、平台管理員數等聚合指標,以及「近期平台稽核」列表(跨所有競賽的最新治理操作)。若部分指標本次無法計算,畫面會標示「部分降級」而不是整頁失敗,其餘資料仍準確可信。

3.2. 使用者

平台上所有帳號的清單,含帳號狀態、全域角色與各競賽角色摘要。可依姓名/Email 搜尋、依帳號狀態與競賽角色篩選,並可只顯示具有效評審角色者。點入任一使用者進入使用者詳細資料頁,內含分頁:

分頁內容 / 可執行操作
基本資料ID、顯示名稱、Email、帳號狀態、全域角色、登入方式、建立與最後活動時間。
競賽與角色列出此使用者在各競賽持有的角色。可授予角色(搜尋競賽 → 選角色 → 授予)或撤銷角色(需填寫原因)。撤銷角色不會刪除既有隊伍/評審關係的歷史紀錄。
隊伍此使用者在各競賽中所屬的隊伍關係。
評審此使用者的評審關係摘要:已提交分數 / 指派數、鎖定筆數、衝突筆數。
帳號與安全高敏感動作區,見下方說明。
稽核歷史與此使用者相關的稽核紀錄(唯讀)。

「帳號與安全」分頁的操作與影響:

  • 停權使用者(Suspend)立即撤銷該帳號所有進行中 session,帳號在恢復前無法登入。不會刪除任何投稿、評分、結果或稽核歷史(帳號停權 ≠ 個資刪除)。
  • 恢復使用者(Reactivate)帳號可再次登入。
  • 撤銷所有工作階段(Revoke sessions)立即撤銷此使用者目前所有 session,但不停權帳號本身,使用者仍可重新登入。
  • 授予平台管理員(Grant super admin)立即授予平台全站所有平台管理權限,於下一次請求生效。
  • 撤銷平台管理員(Revoke super admin)立即撤銷所有平台管理權限。若此帳號是平台最後一位啟用中的 Super Admin,伺服器會拒絕此操作(最後管理員保護)。

每一項高敏感動作都是一個確認對話框:顯示對象、範圍、預期影響,並要求填寫原因(必填)後才能送出;失敗時不會變更任何資料。

3.3. 競賽人員

先選擇一場競賽(可依名稱/代稱搜尋),再查看該競賽內所有持有角色的人員,並可依角色篩選。此頁是唯讀視圖,實際授予/撤銷角色請在使用者詳細資料頁(3.2)或該競賽自己的「成員與角色」頁(4.6)操作。

3.4. 評審

每一列代表一組「使用者 × 競賽」評審關係,同一人評審兩場競賽會出現兩列。可依姓名/Email 或單一競賽 ID 篩選。欄位包含檔案狀態(是否已設定評審檔案)、指派數、已提交分數、已鎖定分數、衝突數與完成度。

3.5. 平台管理員

列出目前持有平台級 super_admin 權限的所有帳號,含授予時間、授予者與近期稽核。可依姓名/Email 搜尋。若某帳號是「最後一位啟用中管理員」,其撤銷操作會被標示為不可執行。這是撤銷/授予 super_admin 的主要操作入口(等同於在使用者詳細資料頁的「帳號與安全」分頁操作)。

3.6. 稽核

跨所有競賽的平台治理操作紀錄,唯讀,沒有編輯或刪除功能。可依操作者使用者 ID、對象使用者 ID、競賽 ID、操作類型與時間區間篩選。每筆紀錄包含 actor、target、competition(如適用)、before/after、reason、timestamp 與 correlation ID,用於事後調查。

4. 競賽管理

路徑 /admin/competitions,任何持有至少一個競賽角色的使用者都能看到自己有權限的競賽;平台管理員可看到所有競賽。進入單一競賽後(/admin/competitions/:id),左側分頁依序為:總覽、類別、賽程輪次、表單、隊伍管理、成員與角色、稽核紀錄、作品繳交、評審、評分規準、結果、檔案。

4.1. 建立競賽

在競賽清單頁點「新增競賽」,只需填寫名稱、網址代稱(小寫連字號、平台唯一)、年度、顯示時區與簡短介紹即可建立。競賽會以草稿狀態建立,在排程設定完成前參與者皆無法看見;其餘設定(排程、資格條件、類別、表單、評分規準…)都在建立後於「總覽」等分頁完成。

正式主辦申請流程(治理模式)

若平台採「Competition Creation Request」治理模式,一般使用者只能申請主辦競賽,不會自動建立正式競賽或取得 competition_admin;需由具 platform.competitions.approve 權限者審核、核准後由伺服器一次性自動建立競賽並把申請人設為第一位 competition_admin(核准與建置流程具冪等性,重試不會建立第二筆競賽)。

4.2. 總覽:基本資訊 / 排程 / 資格條件 / 狀態 / 準備清單

  • 基本資訊名稱、網址代稱、簡短介紹。
  • 排程報名開始/截止、作品繳交開始/截止、評審開始/結束、結果發布,以瀏覽器當地時區輸入,以 UTC 儲存;調整截止時間會記錄稽核。
  • 資格條件隊伍最小/最大人數、是否可含指導老師、是否須有指導老師、是否可多次繳交作品、是否啟用匿名評審。
  • 狀態競賽狀態預設由排程自動推算;管理員可「固定狀態」覆蓋自動結果(需填寫原因),直到取消固定為止,底層排程仍持續計算。
  • 準備狀態清單基本資訊、排程、資格條件、類別、動態表單、評分規準、評審設定、公開頁面、發布,逐項顯示「已就緒 / 尚未開始 / 平台尚未提供」,作為上線前檢查表。
  • 設定公開聯絡信箱、公開競賽頁面是否上線。

4.3. 類別

競賽下的分組(例如高中組、大專組),名稱僅需在同一競賽內不重複,可設定名額上限。類別只能封存而不能刪除,確保曾參照它的隊伍仍能正常顯示歷史資料。

4.4. 賽程輪次

競賽預設為單輪賽制;新增決賽輪次即可啟用「初賽書面審查 → 入圍 → 決賽」的雙階段賽制(一場競賽最多兩輪:preliminary 初賽、final 決賽,這是憲章層級的固定上限)。每輪可獨立設定名稱、狀態(草稿/開放中/評審中/已結束)、提交表單與預設評分表。

4.5. 表單

為每一輪建立動態欄位表單。重要:發布後再編輯表單會複製出新的草稿版本,不會變更目前上線中的內容,已綁定舊版本的繳交資料能永遠依當時的確切 schema 正確顯示。表單編輯器支援欄位排序、必填、驗證規則(最短/最長長度、格式、最小/最大值、允許副檔名)與條件顯示(依其他欄位的值顯示/隱藏)。

4.6. 成員與角色

角色僅適用於此競賽,同一帳號在不同競賽可有不同角色。以電子郵件授予角色(該帳號須至少登入過一次),可選角色為 competition_admin、staff、student、teacher、judge、observer。可撤銷既有角色。

注意

評審角色的邀請與帳號建立不要從這裡進行,請改用「評審邀請」(4.9),那裡具備臨時密碼安全流程;本頁的「授予角色」假設帳號已存在。

4.7. 隊伍管理

查看此競賽所有隊伍與隊員,可移除隊員、轉移隊長(需填寫原因),或建立一次性邀請連結交給要加入的隊員(v1 為手動流程,沒有直接新增隊員的端點;連結可撤銷)。所有操作皆寫入稽核紀錄。

4.8. 作品繳交與檔案

作品繳交頁列出此競賽所有團隊的投稿紀錄,可依狀態、類別、團隊 ID 篩選;點入單筆可看填答內容與已提交版本,每次提交都是不可變快照,版本建立後內容永不變更。檔案頁列出所有上傳檔案,可依狀態或投稿 ID 篩選並產生短效下載連結;作品物件永遠是 private,瀏覽器只能透過範圍受限的簽章操作存取。

4.9. 評審邀請與指派

先在「成員與角色」(4.6)把某帳號設定為 judge 角色,或直接在此頁以 Email 邀請。此頁包含三個區塊:

  • 邀請評審輸入 Email 送出邀請。若該 Email 尚未有帳號,系統自動建立帳號並以 Email 寄送一次性臨時密碼;評審登入後會被強制立即設定新密碼,管理員全程不會看到密碼。邀請紀錄顯示狀態(待接受/已接受/已取消/已過期),可重新發送(會使舊臨時密碼立即失效)或取消邀請。詳見第 5 節安全規範。
  • 手動指派評審勾選作品(可複選)與評審(可複選)並指定評分標準版本,系統會建立每個「作品 × 評審」的組合;重複指派與利益衝突會自動略過並顯示原因。自動指派功能尚未實作。
  • 目前的指派此競賽所有評審與作品的指派關係列表,可編輯(僅限「進行中」狀態的指派)或取消。

4.10. 評分規準

建立評分項目(名稱、說明、權重、最小/最大分數);所有項目權重總和須等於 100 才能儲存。已鎖定的分數不會因規準調整而原地變更,已鎖定 score 不得原地修改,管理員重新開放須附理由並建立 revision history。可為版本設定標籤方便辨識。

4.11. 結果與晉級

計算結果執行(result run)、檢視名次與獎項分級(AWARD_TIERS),必要時可覆寫(override)單一結果並附理由。若競賽有下一輪(決賽),可在此把某輪的最新結果轉為「晉級名單」勾選清單,可勾選特定隊伍或用「取前 N 名」快速選取,再送出建立晉級關係。晉級與獎項永遠由人員決定,系統不會自動判定(憲章範圍外規定)。

4.12. 競賽稽核紀錄

此競賽範圍內的稽核紀錄,僅供新增,無法在此或任何其他地方編輯或刪除。可依動作(如 role.grant)、對象(如 submission)與時間區間篩選,並可檢視每筆紀錄的變更內容細節。

5. 評審邀請與臨時密碼安全規範

「預設密碼」在 NAPAICP 中被明確定義為每次邀請唯一、隨機、短效、不可回查的臨時初始密碼,不是固定或共用密碼。管理員在此流程中的角色與限制:

情境系統行為
受邀 Email 已有帳號不建立第二帳號、不重設既有密碼、不寄送臨時密碼;只寄送競賽評審邀請通知,該使用者以既有帳號登入並接受該競賽的評審角色。
受邀 Email 尚無帳號系統產生密碼學安全隨機的臨時初始密碼,資料庫只保存雜湊值;Email 一次性寄送登入信箱、臨時密碼與到期時間。首次登入後進入強制改密碼流程,改密碼完成前無法存取任何 Judge/Competition 保護資料,且所有相關 API(不只前端畫面)都會拒絕。
  • 管理員無法自行指定或查看臨時密碼或永久密碼,不論在建立、重新發送或任何管理畫面。
  • 重新發送邀請會立即讓舊的臨時密碼失效,並產生新的密碼與到期時間。
  • 臨時密碼不會出現在 log、audit、analytics 或任何可回查紀錄;建議有效期限 24–72 小時。
  • 臨時密碼登入與一般登入同樣受防列舉、rate limit 與鎖定保護;完成強制改密後會 rotate session,降低 session fixation 風險。

6. 帳號自助服務邊界

每個使用者(含管理員自己的帳號)都能透過右上角帳號選單自行管理個人資料,管理員應了解其能力邊界,因為它同時也是自助服務不能做到什麼的參考:

  • 我的資料可修改顯示名稱、單位/組織(僅為自陳,不代表已驗證身分)、語言、時區。
  • 帳號與安全修改密碼(需驗證目前密碼;OIDC 帳號無本地密碼可改,畫面會明確說明由哪個 Identity Provider 管理)、查看已登入裝置並可個別登出或一鍵「登出其他裝置」。密碼變更後其他裝置需重新登入。
  • 角色與權限純唯讀,顯示平台角色與各競賽角色,沒有任何編輯功能;角色有誤請聯絡該競賽管理員或平台管理員。

自助服務永遠不能做的事

Self-Service Profile 不得修改 super_admin、Competition Role、帳號狀態、Judge Assignment、Competition Membership Governance 或任何其他授權狀態;敏感操作(改密碼、改 Email、撤銷其他 session)一律需要重新驗證,不因長效 session 就放行。

7. 治理與安全鐵律

以下規則沒有例外,管理員操作若與其衝突,一律以規則為準:

主題規則
租戶隔離A 競賽的資料不得被 B 競賽的一般使用者讀寫或推論;平台管理跨競賽查詢須具明確權限並使用最小必要欄位。
伺服器端授權UI 角色檢查僅供體驗使用,每個受保護 API 都獨立重新驗證身分、權限、租戶、擁有關係與最新狀態。
歷史不可變投稿與已鎖定分數歷史不可變:不得原地修改,修正只能建立新版本/附理由重新開放。
匿名評審與私有檔案匿名評審 DTO 不得洩漏可識別欄位;作品檔案永遠 private,僅能短效簽章存取。
可稽核性敏感管理操作必須產生一般使用者不可刪除的稽核紀錄,且需含操作者、對象、競賽、變更前後內容、原因、時間戳與追蹤代碼。
平台與競賽管理分離平台管理與競賽管理明確分離;super_admin 不因全域角色繞過歷史不可變、可稽核性等規則。
最後管理員保護任何會使啟用中 super_admin 數量降為零的操作都會被伺服器拒絕。
首位管理員 Bootstrap首位管理員只能透過受保護的一次性 Bootstrap 流程產生;已有管理員後所有 Bootstrap 請求一律失敗。
評審憑證自主權評審憑證由使用者自己建立/控制,管理員不得建立或查看永久密碼;臨時密碼一次性、不可回查。
自助服務邊界自助服務不得修改授權狀態;敏感帳號變更需重新驗證;自陳單位資訊不等於已驗證身分;由外部身分提供者管理的欄位不得本地重複修改。
個資最小化平台列表僅回傳治理必要的個資;停權不等於個資刪除;正式個資刪除需依核准政策區分刪除/匿名化/法定保留;不提供未經核准的全平台個資批次匯出。

8. 常見問題與疑難排解

我是新部署的第一個使用者,登入後看不到平台管理選單?
這是預期行為。註冊與登入本身不會授予任何平台權限。請依 2.2 節走 Bootstrap 流程,並事先跟部署負責人取得 Bootstrap Credential。
可以把某個管理員的權限撤銷,讓平台完全沒有管理員嗎?
不行。伺服器會拒絕會讓啟用中 super_admin 數量降為零的操作。若真的需要交接,請先授予新管理員,再撤銷舊帳號。
評審登入時輸入的臨時密碼在哪裡可以查到?
查不到。臨時密碼只在產生後的單次通知信中出現,資料庫只存雜湊值,管理後台不提供查看功能。若評審沒收到信或密碼已過期,請在「評審邀請」(4.9)按「重新發送」,會產生新密碼並讓舊密碼立即失效。
發布後的表單能不能直接修改欄位?
可以編輯,但發布後編輯永遠是「複製出新草稿版本」,不會覆蓋目前上線內容;已綁定舊版本的既有繳交資料仍依原 schema 顯示。改完記得再次「發布」新版本才會對使用者生效。
已鎖定的分數評錯了怎麼辦?
不能直接改。管理員需在對應介面重新開放並填寫理由,系統會建立 revision history,原始分數紀錄仍保留可追溯。
我以 competition_admin 身分能不能看到別場競賽的資料?
不能。租戶隔離由伺服器端獨立驗證,即使猜到 URL 或 ID 也無法存取。

9. 名詞對照表

中文English說明
平台管理員 / 超級管理員Super Admin全域治理角色,跨所有競賽。
競賽管理員Competition Admin單一競賽的主辦管理員。
租戶隔離Tenant isolation競賽之間資料互不可見、互不可推論。
稽核紀錄Audit log僅供新增、不可編輯或刪除的操作歷史。
臨時初始密碼Temporary Initial Password每次評審邀請唯一產生、單次使用、不可回查的密碼。
最後管理員保護Last-admin protection禁止讓啟用中管理員數量降為零的規則。
BootstrapBootstrap全新部署時建立第一位平台管理員的一次性流程。
晉級Advancement初賽入選進入決賽的隊伍名單,由人員決定。

本手冊依目前系統實際畫面與操作行為撰寫,如與實際畫面不符,請回報差異以便更新。

還有其他問題?

回到快速開始

其他角色操作手冊