ARENAMATE · 設計交付規格 · 2026-07-23
教練系統 畫面規格書
給 Claude Design 的完整開工文件。目標:把 全畫面互動 Prototype 的體驗做進 ArenaMate 正式 App(Flutter,Apps/arena_mate)。每個畫面都寫明:放哪個檔、class 叫什麼、從哪進、用哪些互動元件、醒目度怎麼配、表單每一格的控件與預設值。
Claude Design 開工前必讀:
① 互動參照=
prototype(行為對照用,視覺不要照抄它的簡化風)
② 架構背景=
三方架構報告
③ 設計語言正本=
lib/design/tokens.dart(AC 色票)/
typography.dart(AText)/
widgets.dart(ArButton/ArChip)—
只用現有 token,不自創色票
④ 鐵則:套設計只換視覺不動佈局邏輯;動到
lib/data/ 先讀
docs/Arena_流程邏輯圖.md §9;新畫面一律掛 flag;UI 不用 emoji(用 Material icon)。
目錄
1.1 設計 token 與元件庫(現有,直接用)
| 資源 | 位置 | 內容 |
色票 AC | lib/design/tokens.dart | bg/surface/fill/line/line2/text/sub/dim + green/gold/blue/coral。角色色慣例:教練=gold、場館=green、學員=blue、平台=紫(如缺就近用 blue,勿自創) |
字體 AText | lib/design/typography.dart | AText.body(size,weight,color,height) 內文;AText.display 數字/金額(自帶 tabular)。金額一律 display |
| 元件 | lib/design/widgets.dart | ArButton(label,solid,onTap,disabled)、ArChip(label,color) |
| 頭像 | lib/redesign/ui/a_avatar.dart | AAvatar — 人一律用它(含 fallback) |
| 課程封面 | coach_course_pages.dart 內 courseCover() | 共用封面元件(cover_url 斷點回填),課程圖只准用它 |
| 貼紙元件 | lib/redesign/toy/sticker_widgets.dart | Proto B 已建:StickerWallCard/showStickerPicker/stickerIcon — 直接沿用升級 |
| 場館頁專用 | toy_venue.dart 的 TF/TT | 場館頁(toy_venue)自成一套 token,在該檔內改動照用 TF/TT,不要混 AC |
1.2 老闆偏好互動元件目錄(用這些,別發明新的)
| 元件 | 現有實作(參照) | 什麼時候用 |
| 翻面卡 FlipCard(rotateY,正面精華/背面詳情) | toy_venue.dart _FlipCoachCard、gym_calendar_page.dart _CalendarEventCard | 老闆 2026-07-13 拍板的招牌互動。任何「一張卡=一個實體」的展示:課程卡、教練卡、月曆活動卡。正面=名稱+價錢+一個狀態章;背面=明細列+單一 CTA |
| 倒數膠囊 Capsule | today_class_capsule.dart TodayClassCapsule | 時間敏感的置頂提醒:當日課程、撥款日到了、邀約待回覆。點開=bottom sheet 詳情 |
| chips 選擇器(單選/多選上限) | 貼紙 picker(sticker_widgets.dart)、月曆篩選 chips | 一切 2–8 個選項的選擇。多選要有上限(貼紙=3)。選中態=主色底 16% + 主色框 1.6px |
| stepper(半小時制/整數) | 批B 時數 stepper(template_studio.dart) | 數字輸入優先用 stepper:時數(30 分階)、堂數、抽成 %(0–30 階 5)。鍵盤輸入是 fallback 不是預設 |
| 月曆格+色點 | ops_calendar.dart、gym_calendar_page.dart(課綠/賽金/揪藍/休灰) | 一切日期選擇與日程展示。開課精靈選時段=點月曆空閒格,不是 date picker 列表 |
| bottom sheet(圓角 20 頂部把手) | 全 App 慣例 showModalBottomSheet | 所有次級流程(確認/表單/picker)。避免 full-page push 除非是可回訪的目的地 |
| 拖拉排序 | 模板群組拖拉(template_studio.dart group_order)、排陣頭像拖拉(lineup_board.dart) | 順序有意義的清單:模板堂次排序、推薦位排序 |
| 磁貼格 tiles | 櫃檯 gym_counter.dart | hub 型頁面的功能入口(2 欄磁貼),badge 數字掛右上 |
| 樂觀更新+轉圈 | 鐵則 memory button-async | 每顆 async 按鈕:按下立即 spinner/樂觀變化,禁止按了沒反應。批次讀取用 Future.wait 併行 |
| 決策卡三選一 | 流課決策卡(coach_course_pages.dart 照開/延期/取消) | 需要人做選擇的系統事件:公休連鎖、流課。三個大按鈕直排,每顆帶一行後果說明,危險選項紅色放最後 |
1.3 醒目度四級制(反單調系統)
老闆點名「畫面不要單調,按重要性分級醒目度」。每個畫面的每個元素必須標定 A/B/C/D 一級,規則:
A全場焦點(每畫面 0–1 個) — 色底 banner 或大數字卡:主色 10% 底+45% 框、標題 w800、可帶輕微入場動效。用於:本月摘要 banner、應付總額、當日課倒數、待決策事件。沒有 A 級元素的畫面=單調,不合格(純列表頁用「摘要列+大數字」湊 A)。
B主要行動(每畫面 ≤2 個) — 實心主色按鈕(ArButton solid)或主色框行動卡。一頁最多兩顆實心鈕;第三個以上的行動一律降 C。
C內容卡(不限量) — 標準卡:surface 底+line 框+radius 12–14。資訊列 kv 兩欄:左灰標籤右粗體值。
D輔助說明(每卡 ≤1 行) — hint 小字(10.5–11px dim 色):規則解釋、冪等說明。超過一行就該做成「?」icon 點開 sheet。
反單調三招(每頁至少用一招):①狀態用形狀不只用字 — pill 章/色點/進度環;②數字放大 — 金額/計數用 AText.display 18–24px 配色;③分區帶 icon 的 section 標題,不要連續 4 張以上同構卡。
1.4 表單鐵則(預設值+選擇器優先)
鐵則一:每個欄位都有預設值。預設值優先序:上次填的值 > 模板/合約帶入值 > 參數系統解析值 > 全平台常見值。表單打開的瞬間就是「可直接送出」狀態。
鐵則二:控件選擇順位(能上面就不用下面):
- 2–8 選項 → chips(單選/多選)
- 2–3 互斥模式 → segmented 切換(包場/場邊)
- 有步階的數字 → stepper(時數 30 分階、抽成 5% 階、堂數 1 階)
- 範圍數字 → slider+即時顯示值(折扣 %)
- 日期時間 → 月曆點格(排課)或系統 picker(單一日期)
- 清單挑一 → picker sheet(帶頭像/摘要列,可搜尋)— 例:選代課教練
- 自由文字 → 只允許:名稱、備註、留言。金額用數字鍵盤+千分位即時格式化
鐵則三:選填欄位要「明顯可跳過」 — 選填一律給「不指定(說明後果)」chip,例:代課教練「不指定 → 缺席時跨館代課池遞補」。
鐵則四:表單超過 5 欄=分步精靈(開課精靈 pattern),每步一個主題,頂部進度點,最後一步=可回改的摘要確認卡。
1.5 命名/檔案/flag 規範
- 畫面檔:
lib/redesign/toy/(三端用戶面)、lib/redesign/admin/(場館後台/平台主控台),snake_case
- 資料層:
lib/data/ — Gate 純函數(必配 test/gates/*_test.dart)+Repository+Provider,不碰 UI
- Flag:
lib/data/feature_flags.dart,const bool.fromEnvironment('FLAG_XXX', defaultValue: true)(dogfood 預設開),每畫面規格已指定 flag 名
- 新增畫面必同 commit 更新:
docs/Arena_流程邏輯圖.md §9+docs-site/public/arena-testing-data.js(scenario 編號已在各畫面規格)
- 命名一律沿用既有詞彙:課程=course、堂=slot、報名=enrollment、分錄=ledger、撥款批=payout — 不要換字
1.6 工程陷阱(這個 codebase 踩過的坑,設計時就要避)
- 內嵌 widget 的 key 別綁 FutureProvider 值(閃 null 會毀 state)— 動畫元件尤其注意
- 深色面板忌近黑:surface 要亮過 bg+帶 line 框,空 list ≠ null(都要有空態文案)
- Supabase
.order() 預設降冪,一律明寫 ascending
- per-id family StreamProvider 一律 autoDispose(漏 websocket)
- id→名字一律走
directory.dart 全域撈;人=user_profile_id,禁 per-gym 身分
- alert 少術語、能背景處理就別彈;錯誤要講人話+下一步
- 金流顯示:費率/金額永遠讀 server 快照欄位,client 不得自算後顯示不同值
2. 畫面總表(28 畫面)
狀態欄:已有=畫面存在只需視覺/互動升級;改造=existing 檔案加區塊或大改;新建=新檔案新畫面。
| # | 畫面 | Class | 檔案 | 入口 | 狀態 | Flag |
| S1 | 開課月曆(行銷) | GymCalendarPage(marketMode) | toy/gym_calendar_page.dart | 場館頁課程區「開課月曆」/櫃檯 | 改造 | kGymCalendarMarket |
| S2 | 課程詳情/報名 | CourseDetailPage | toy/coach_course_pages.dart | 月曆卡/列表卡/翻卡/推薦卡 | 改造 | kCourseTermsCard(新) |
| S3 | 我的課程+請假 | MyCoursesPage | toy/coach_course_pages.dart | 通知/課程列表頁 | 改造 | kCourseLeaveDm(沿用) |
| S4 | 成長頁+貼紙 | MyGrowthPage | toy/coach_course_pages.dart | MyCoursesPage | 已有 | kStickerReviewsV2 |
| S5 | 課程推薦區塊 | CourseRecsSection | toy/course_recs.dart(新) | CourseListPage 頂+MyCoursesPage 底 | 新建 | kCourseRecsV1 |
| S6 | 送貼紙 picker | showStickerPicker | toy/sticker_widgets.dart | S2/C5 內 | 已有 | kStickerReviewsV2 |
| S7 | 補課 credit sheet | MakeupCreditSheet | toy/coach_course_pages.dart 內 | S3 請假成功後 | 新建 | kMakeupCredit |
| C1 | 教練工作室 | CoachStudioSections | toy/coach_studio.dart | CoachSettingsPage | 改造 | — |
| C2 | 模板編輯(每堂價) | TemplateStudio | toy/template_studio.dart | 工作室②區 | 改造 | kPerSlotPrice |
| C3 | 開課精靈 | CourseOpenFlowPage | toy/coach_studio.dart | 工作室③/邀約接受 | 改造 | kCourseSubGuarantee |
| C4 | 邀約協商收件匣 | CoachInvitePage | toy/coach_invite_page.dart(新) | 工作室 badge/通知 | 新建 | kInviteNegotiation |
| C5 | 點名+遲到閘門 | CourseRollCallPage | toy/coach_course_pages.dart | 課程管理/當日膠囊 | 改造 | kLateGate |
| C6 | 記帳本+月結算單 | CoachLedgerPage | toy/coach_ledger_page.dart(新,自 sheet 升級) | CoachSettingsPage | 新建 | — |
| C7 | 我的合約與參數 | CoachContractPage | toy/coach_contract_page.dart(新) | CoachSettingsPage | 新建 | kPolicyParams |
| C8 | 貼紙牆(品牌區) | StickerWallCard | toy/sticker_widgets.dart | CoachSettingsPage/品牌頁 coach.html | 已有 | kStickerReviewsV2 |
| G1 | 後台總覽 | AdminHub/AdminTab | admin/admin_hub.dart | 後台入口 | 改造 | — |
| G2 | 課程審核 | CourseReviewAdmin | toy/coach_course_pages.dart | AdminTab sub | 已有 | — |
| G3 | 管理教練+行為指標 | CoachAdmin | toy/coach_pages.dart | AdminTab sub 'coach' | 改造 | kStickerReviewsV2 |
| G4 | 邀約教練(協商) | GymInviteComposer | admin/gym_invite.dart(新) | G3 header「邀約開課」 | 新建 | kInviteNegotiation |
| G5 | 招募教練貼文 | GymRecruitPage | admin/gym_recruit.dart(新) | AdminTab 選單「招募教練」 | 新建 | kRecruitBoard |
| G6 | 公休連鎖決策 | ClosureCascadeSheet | admin/ops_calendar.dart 內 | 營運日曆標暫停後自動彈 | 新建 | kClosureCascade |
| G7 | 館帳本+撥款確認 | GymLedgerAdmin | admin/gym_ledger_page.dart | AdminTab sub | 已有 | — |
| G8 | 開站合約+參數覆蓋 | GymAgreementPage | admin/gym_agreement.dart(新) | AdminTab 選單「平台合約」 | 新建 | kGymAgreement |
| P1 | 平台總帳 v2 | PlatformMoneyConsole | admin/platform_money.dart | 個人頁選單(operator) | 改造 | kPlatformLedgerV2 |
| P2 | 參數中央管理 | PolicyParamsConsole | admin/policy_params.dart(新) | P1 header 齒輪 | 新建 | kPolicyParams |
| P3 | 風控台 | RiskConsole | admin/risk_console.dart(新) | P1 header 盾牌 | 新建 | kRiskConsole |
| P4 | 推銷決策 | PromoteConsole | admin/promote_console.dart(新) | P1 header 喇叭 | 新建 | kPromoteConsole |
| P5 | 撥款批管理 | (P1 內區塊) | admin/platform_money.dart | P1 捲動區 | 已有 | kPlatformLedgerV2 |
3. 學員端(角色色=blue)
S1 開課月曆(行銷模式)
檔案 lib/redesign/toy/gym_calendar_page.dart · Class GymCalendarPage(marketMode:true) · 入口=場館頁課程區 header「開課月曆」膠囊+櫃檯 · Flag kGymCalendarMarket · 測試 S40(已綠,此處為視覺升級)
- A本月摘要 banner:「本月 N 門課共 M 堂 · X 門可報名」大字+副行提示。X>0 時 banner 右端加一顆迷你「看可報名」chip,點了月曆只亮可報名課的格子(dim 其他)
- B月曆格:課程日=綠點+課名縮寫;選中日下方課程列(每列=課名/時間/教練/金額 display 金色/可報名章)。點列→翻面卡(既有 _CalendarEventCard):正面加價錢行(已做),背面「看課程詳情/報名」
- C月份切換 chevron+篩選 chips(行銷模式預設 course 並把另外兩顆降淡)
- D「可報名為顯示層近似,以課程頁為準」hint 收進「?」sheet,不佔版面
資料:gymCalendarProvider+CalendarMarketGates(已建)。空態:「本月還沒排課」banner 轉灰+CTA「看其他月份」。
S2 課程詳情/報名頁
檔案 lib/redesign/toy/coach_course_pages.dart · Class CourseDetailPage · 入口=所有課程卡 · Flag 新 kCourseTermsCard · 測試 新 scenario S41
- A頂部課程 hero:courseCover 滿寬+疊 chip(單堂/學程、程度標籤)+課名+教練列(AAvatar+名字+貼紙牆前 3 名縮排,點教練列→教練簡介 sheet 含完整貼紙牆)
- B報名主鈕(solid,帶總價):報名 sheet 三步走 — ①條款快照卡(新):列 4 行「請假時限/退款政策/代課安排/傷害保障」,每行右側小章標來源層(平台紫/場館綠/課程金);②付款方式 chips(課包折抵=第一位若可用+綠界);③成功態=綠勾+「分帳已入帳」一行
- C「每堂課表與價錢」卡:逐堂列(日期/時間/每堂價/已上章);系列折扣有值時總價行加刪除線原價。代課保障卡:有指定=藍框卡+代課教練 AAvatar+「代課保障」章;未指定=灰卡一行說明跨館池
- Drefund_policy 全文收「退款政策」展開列
表單(報名 sheet):無需填寫任何字 — 付款方式 chips(預設=課包可用則課包,否則綠界)+條款「同意並報名」單鈕。資料:既有 providers+resolveParams(P2 建好後接)。狀態:已報名=主鈕換狀態列(已報名章+付款狀態+取消報名次鈕);截止=主鈕 disabled「報名已截止」。
S3 我的課程+請假
檔案同上 · Class MyCoursesPage · Flag 沿用 kCourseLeaveDm+新 kMakeupCredit · 測試 S42
- A下一堂倒數膠囊(沿用 TodayClassCapsule 樣式,學員版):最近一堂的課名+日期倒數,點開=該堂 sheet(位置/自備物品/請假鈕)
- B每門課卡:完成率進度環(不是文字%)+堂次列。未來堂右側「請假」次鈕→sheet:大字顯示「你的時限:開課前 N 小時」(讀報名快照)+單顆確認鈕;超時=鈕 disabled+紅字 too_late 說明
- C學程課多一條階段解鎖列(出席 ≥60% 進度條)
- D快照參數一行(請假 Nh · 截止 Nh · 退款政策)收在卡底
S7 補課 credit sheet(新):請假成功即彈:「獲得 1 張同課程補課 credit」+可用堂次 chips(同課程未滿的未來堂,預設=最近一堂)+「先留著」次鈕。不做學程券(法遵),credit 僅限同課程。
S4 成長頁+貼紙 / S6 送貼紙 picker
Class MyGrowthPage/showStickerPicker(已有) · Flag kStickerReviewsV2
- A頁首成就帶:貼紙總數大數字+streak 火焰+技能曲線縮圖,三格橫排(玩家卡風格)
- C「我收到的教練貼紙」牆(既有 StickerWallCard,綠系);課後總結時間軸卡照舊
- picker 既有版已合格(chips 上限 3+送出計數)。升級:選中時貼紙輕微放大 1.1 彈跳;送出後 confetti 一次(尊重 reduce motion)
S5 課程推薦區塊(新)
檔案 lib/redesign/toy/course_recs.dart(新) · Class CourseRecsSection · 掛載=CourseListPage 頂部+MyCoursesPage 底部 · Flag kCourseRecsV1 · 測試 S43(Gate=RecsGates 純函數:同教練>同館>同類型>程度階梯,各附「因為…」理由字串)
- B橫捲卡列(高 ~150):courseCover 縮圖+課名+價錢+理由 chip(「因為你上過陳教練的課」)— 理由必顯示,推薦不解釋=黑箱感
- D列尾「怎麼推薦的?」→sheet 說明規則式邏輯
空態:整個 section 隱藏(不出現「沒有推薦」)。
4. 教練端(角色色=gold)
C1 教練工作室(hub 改造)
檔案 lib/redesign/toy/coach_studio.dart · Class CoachStudioSections · 入口=CoachSettingsPage
- A當日膠囊(既有 TodayClassCapsule)保持第一位;其下加邀約膠囊(有 pending 邀約時):「大直邀你開課 · 週五 20:00」金色框,點開=C4
- B四區磁貼改 2×2(履歷/模板/開課/行事曆),badge:模板數、待審課數
- C新增第五列橫排三小卡:記帳本(可撥金額大字)/合約與參數/貼紙牆(前 3 名)→ 分別進 C6/C7/C8
C2 模板編輯器(每堂不同價)
檔案 lib/redesign/toy/template_studio.dart · Class TemplateStudio · Flag kPerSlotPrice · 測試 S44 ⚠️ 依賴 DB:coach_course_slots.price+模板 sessions jsonb 加 price(migration 先行,分帳/退款/pass 三處連動=批δ 工程)
| 欄位 | 控件 | 預設值 |
| 每堂價格 | 逐堂列右側 stepper(50 元階)+點數字可鍵盤 | 上一堂的價(第一堂=模板 price_per_session) |
| 快速工具 | 列表頂 chips:「全部同價」「後段加價 +100」「首堂體驗價」 | — |
| 堂次順序 | 拖拉把手(既有 group 拖拉 pattern) | — |
- A頂部總價即時條:總價大字+「逐堂 450/450/550/550」小字,改任何一堂即時跳動
- D連動警語一行:「堂價影響分帳/退款/課包折抵,送審後鎖定」
C3 開課精靈(加代課步+截止覆蓋)
檔案 lib/redesign/toy/coach_studio.dart · Class CourseOpenFlowPage · Flag kCourseSubGuarantee · 測試 S45
維持既有三步骨架,第 2/3 步之間插「保障與規則」步。全精靈零必填打字:
| 步 | 欄位 | 控件 | 預設值 |
| 1 模板 | 選模板 | 模板卡橫捲(封面+堂數+總價) | 最近使用的模板 |
| 2 場地 | 包場/場邊 | segmented 兩格,各帶費用試算行 | 上次選擇 |
| 2 場地 | 時段 | 月曆點空閒格(既有) | —(必點) |
| 3 保障 | 代課教練(選填) | picker sheet:同運動教練列(AAvatar+駐館+接單狀態),第一 chip=「不指定 → 跨館池遞補」 | 上次指定的代課;首次=不指定 |
| 3 保障 | 報名截止 | chips:24h(平台預設)/48h/72h/自訂 stepper | 參數解析值(標來源層小章) |
| 4 送審 | 摘要確認 | 摘要卡(可點回改)+單顆送審鈕 | — |
- A指定代課後,摘要卡即時亮「代課保障」藍章+「報名頁會顯示,轉換率加分」一行 — 把 G11 的誘因做在畫面上
C4 邀約協商收件匣(新)
檔案 lib/redesign/toy/coach_invite_page.dart(新) · Class CoachInvitePage · 入口=C1 邀約膠囊+通知 kind coach_schedule_invite 落點 · Flag kInviteNegotiation · 測試 S46 ⚠️ 依賴 DB:新表 arena_coach_invites(gym/coach/slot_text/template_hint/note/status)
- B邀約卡(翻面卡):正面=館名+時段大字+條件摘要;背面=完整條件 kv 列+三鈕:「接受 → 生成課程草稿」(solid)/「回訊商量」(開 DM)/「婉拒」(灰)
- A接受成功=全螢幕輕動效+直接 push C3 精靈(模板/時段預填,頂部「從邀約帶入」banner)
- C歷史邀約列(已接受/已婉拒章)
C5 點名頁+遲到閘門
檔案 lib/redesign/toy/coach_course_pages.dart · Class CourseRollCallPage · Flag kLateGate · 測試 S47 ⚠️ 依賴:遲到自動判缺席 server RPC(現只有 UI 顯示遲到分鐘)
- A頁首規則膠囊:「本館遲到判定 N 分」(讀參數解析,標來源層章)— 教練隨時知道紅線在哪
- B每堂 sheet(既有)升級:教練簽到列顯示遲到分鐘進度條(0→N 分,綠→黃→紅);超過 N 分時「完成本堂」變紅鈕「本堂視同缺席(全退+記警)」,按下要二次確認 sheet 列明後果三行
- C學員列:出席/遲到/缺席 chips(既有)+完課堂「貼紙」chip(既有)
- D「學員請假章=快照時限內申請」hint
C6 記帳本+月結算單(sheet 升級成頁)
檔案 lib/redesign/toy/coach_ledger_page.dart(新) · Class CoachLedgerPage · 入口=CoachSettingsPage 列+C1 小卡 · 測試 S48
- A三格金額帶:鎖定中(金)/可撥(綠)/已入帳(藍)大數字 — AText.display 20px
- B月結算單卡:本期(上月完課)應收大字+「複製對帳文字」鈕(既有 pattern)+預計撥款日(參數 payday)
- C分錄明細:按課程分組收合列,展開=逐堂(日期/金額/狀態章/場地費負項紅字)
- D「已撥款分錄不可異動」hint
C7 我的合約與參數(新)
檔案 lib/redesign/toy/coach_contract_page.dart(新) · Class CoachContractPage · 入口=CoachSettingsPage 列 · Flag kPolicyParams · 測試 S49(與 P2 同批)
- A合約狀態帶:三份合約(場館分成/平台服務/學員快照)各一顆狀態章(已簽綠/待簽金)
- C「對你生效的參數」表:每列=參數名/值大字/來源層章(平台紫/場館綠/課程金)— 這是把「合約=程式同一組數字」可視化的關鍵畫面
- D條款全文=展開列(kAgreementText,唯讀)
5. 場館端(角色色=green)
G1 後台總覽(hub 改造)
檔案 lib/redesign/admin/admin_hub.dart+admin_tab.dart · 入口=後台
- A待辦帶(收件匣式):課程待審 N/教練申請 N/招募應徵 N/邀約已回覆 N — 四顆數字磁貼,非零者亮紅 badge,點進對應頁。全零時顯示「今日無待辦」綠帶
- C功能磁貼區加三格:招募教練(G5)/平台合約(G8)/邀約開課(G4 入口也在 G3 header)
G2 課程審核(視覺升級)
檔案 toy/coach_course_pages.dart · Class CourseReviewAdmin(既有,批A 已重排)
- B審核卡:總價標題行/學程時數+場地費行/逐堂日期時間(既有排版)+代課安排行(新):有指定=藍章,未指定=灰字。核准(solid)/退回(需選原因 chips:時段衝突/資料不全/其他)
- D「核准=佔位轉正+合約蓋章;3 個工作天未處理自動釋出」hint
G3 管理教練+行為指標
檔案 toy/coach_pages.dart · Class CoachAdmin(Proto B 指標卡已在,此處升級) · Flag kStickerReviewsV2
- Aheader 右側「邀約開課」主鈕(進 G4)
- B行為指標升級:每教練一列 — 完課率迷你進度環+退款率+請假數+貼紙數;警示 chips(退款率偏高/完課率偏低)只在樣本夠時亮(報名≥5/堂數≥5,Gate 已建)。點列展開近 5 門課明細
- C抽成編輯:stepper 5% 階(0–30)取代裸數字框,旁註「開課時快照,不溯及已開課」
G4 邀約教練(協商 composer,新)
檔案 lib/redesign/admin/gym_invite.dart(新) · Class GymInviteComposer(bottom sheet 即可,不必整頁) · 入口=G3 header · Flag kInviteNegotiation · 測試 S46(與 C4 同批)
| 欄位 | 控件 | 預設值 |
| 邀請對象 | picker sheet:本館教練優先+跨館代課池教練(AAvatar+專長+星章) | 本館開課數最多的教練 |
| 建議時段 | 營運月曆點空閒格(重用 ops calendar 資料)+重複 chips(單次/每週同時段×N) | 下週同天最早空檔 |
| 建議模板 | chips:該教練現有模板列+「由教練決定」 | 由教練決定 |
| 條件備註 | 文字框(唯一自由文字,選填) | 「場地費照合約」 |
- B送出鈕帶預覽:「陳教練將收到:週五 20:00 · 羽球進階 · 場地費照合約」— 送出前看得到對方看到什麼
G5 招募教練貼文(新)
檔案 lib/redesign/admin/gym_recruit.dart(新) · Class GymRecruitPage · 入口=AdminTab 選單 · Flag kRecruitBoard · 測試 S50 ⚠️ 依賴 DB:arena_gym_recruit_posts+applies;應徵接受後復用既有 coach_apply 核准流,不另起爐灶
| 欄位 | 控件 | 預設值 |
| 職缺標題 | 文字框 | 「徵{館主運動}教練」自動組字 |
| 我提供的場地 | chips 多選(從 gym_venues 自動生成:場地名+規格)+補充文字選填 | 全選 |
| 時段需求 | chips:平日晚/週末/早鳥/皆可 | 平日晚 |
| 教練條件 | chips 多選:證照等級(C/B/A)+可帶程度(初/中/高) | C 級+初中階 |
| 分成條件 | stepper 抽成 %(0–30)+場地費顯示(唯讀,從場地設定帶) | 本館現行預設 |
- A貼文預覽卡=實際公開樣(教練端看到的樣子),編輯即時反映
- B應徵者列:AAvatar+證照章+品牌頁連結,「接受 → 進教練核准流」/「婉拒」
G6 公休連鎖決策 sheet(新)
檔案 lib/redesign/admin/ops_calendar.dart 內 · Class ClosureCascadeSheet · 觸發=營運日曆標暫停日送出後自動彈出(有受影響課堂時) · Flag kClosureCascade · 測試 S51 ⚠️ 依賴:cascade orchestrator(改期/代課/退款批次副作用)
- A受影響清單卡:「7/25 公休影響 N 堂課 M 位學員」大字+逐堂列(課名/時間/報名數/有無代課章)
- B決策卡三選一(流課決策卡同款):①全部改期(自動找同時段下週空檔,逐堂可改)②有代課的照上、其餘改期 ③全部取消該堂退款(紅,二次確認列退款總額)。每顆帶一行後果
- D「處置後自動通知學員+教練;退款走單一退款函數」hint
零受影響時:不彈 sheet,只 toast「公休已標記,無課堂受影響」。
G7 館帳本+撥款確認(視覺升級)
檔案 lib/redesign/admin/gym_ledger_page.dart · Class GymLedgerAdmin(既有)
- A三格金額帶(同 C6 樣式):累積中/平台已撥待確認(金,有值時閃爍一次)/已入帳
- B待確認撥款卡:批金額大字+逐筆來源列+「確認入戶」solid(按下=記銀行收入,既有 RPC)
- C帳本流水:in/out 雙色列+source_type 章(場地費/分潤/退款/平台費)
G8 開站合約+參數覆蓋(新)
檔案 lib/redesign/admin/gym_agreement.dart(新) · Class GymAgreementPage · 入口=AdminTab 選單「平台合約」 · Flag kGymAgreement · 測試 S52 ⚠️ 依賴 DB:arena_gym_agreements(版本化,複製教練合約 pattern)
- A合約狀態卡:版本+雙方簽章狀態(場館章/平台章)+「簽署」solid(未簽時)
- C條款 kv 列:平台費 %/撥款義務/責任分配/資料歸屬(唯讀)
- B「本館參數覆蓋」卡:可覆蓋參數列(遲到判定分/月結日…),每列=平台預設值(灰)→本館值 stepper;改值需平台核可時顯示「送出申請」而非即改(v1 先做即改+審計 log)
- D「改參數只影響之後的新報名,舊報名照快照」hint(每次改動 toast 也要講)
6. 平台端(角色色=violet;operator 專屬,寬版 console 佈局)
P1 平台總帳 v2(Proto A 升級)+P5 撥款批
檔案 lib/redesign/admin/platform_money.dart · Class PlatformMoneyConsole(既有+Proto A 三卡) · Flag kPlatformLedgerV2 · header 加三 icon:齒輪→P2/盾牌→P3/喇叭→P4
- A應付彙總帶(Proto A 已建,視覺升級):欠教練/欠場館/代管總額三大數字+「代管中」進度條(held vs 可撥比例)— 一眼看錢的形狀
- B撥款節奏卡:過 15 號=紅底催辦(既有);產生撥款批 → 批列(既有)。逐筆勾稽(Proto A):貼上框+四桶結果 — 升級:結果桶用四色計數章+異常列紅底,全對時大綠勾「本期 N 筆全對上」
- C合約分成總表(Proto A):升級為可排序(按已收總額/課程數)+搜尋框
- D綠界手動結算記帳(既有)保留
P2 參數中央管理(新,批α 核心畫面)
檔案 lib/redesign/admin/policy_params.dart(新) · Class PolicyParamsConsole · 入口=P1 齒輪 · Flag kPolicyParams · 測試 S49 ⚠️ 依賴 DB:arena_policy_params 三層表+PolicyGates.resolve+報名快照欄位(批α 工程,本畫面是它的操作台)
| 欄位(平台預設層) | 控件 | 預設值(=現行拍板) |
| 學員請假時限 | stepper(小時,1 階) | 4 |
| 報名截止 | stepper(小時) | 24 |
| 流課決策窗 | stepper(小時) | 24 |
| 遲到判缺席 | stepper(分,5 階) | 15 |
| 月結日 | chips:1/5/10/15/20/25 | 15 |
| 缺席停權門檻 | stepper(次) | 2 |
| 佔位釋出 | stepper(工作天) | 3 |
| 退款三段 | 三格 stepper(天/小時/%) | 7d/72h/50% |
- A「解析示範」即時卡:選任一門課(picker),顯示每個參數的最終值+來源層章(平台紫/場館綠/課程金)— 你改上面,這裡即時變
- B儲存=版本化(記 who/when/舊值),儲存 sheet 必列「影響範圍:僅之後的新報名;既有 N 筆報名照快照不動」
- C場館覆蓋一覽表:哪些館覆蓋了哪些參數(值+比平台嚴/鬆箭頭)
P3 風控台(新)
檔案 lib/redesign/admin/risk_console.dart(新) · Class RiskConsole · 入口=P1 盾牌 · Flag kRiskConsole · 測試 S53 ⚠️ 課包轉讓 Gate(轉讓後不可退/限轉 1)要進 pass 引擎 server 端,本畫面=開關+事件流
- A代管資金自證卡:「代管中總額」大數字+「逐筆可列」鈕(展開=按對象分組清單)— G8 的可視化
- B課包風控規則卡:轉讓後不可退款/限轉 1 次/轉讓冷卻 72h — 三顆 toggle(預設全開)+每顆一行理由
- C風險事件流:被 Gate 擋下的操作列(時間/類型/涉及帳號),空態=「近 30 天無風險事件」綠帶
- C留存價值主張 checklist(G6):金流保障/履歷累積/報稅便利/平台團保 — 各掛狀態章(已上線/規劃),讓老闆追蹤反外逃武器的落地
P4 推銷決策(新)
檔案 lib/redesign/admin/promote_console.dart(新) · Class PromoteConsole · 入口=P1 喇叭 · Flag kPromoteConsole · 測試 S54
- B教練排行卡列:行為指標綜合排序(完課率/續約/貼紙/累積學費,權重 Gate 可調)— 每列:AAvatar+名字+四指標迷你條+「加入推薦位」toggle(=名師駐館機制,PR 條件之外的人工位)
- C推薦位現況:目前在地圖曝光的名單(拖拉排序)
- D「有記警/停權者自動不可推」hint(Gate 擋,toggle disabled)
7. 交付順序與驗收
建議施工順序(依賴關係):
- 第 1 批(純視覺,無 DB 依賴):S1/S2(除條款卡)/S4/S6/C1/C5(UI 部分)/C6/G1/G2/G3/G7/P1 — 全是既有畫面升級
- 第 2 批(小 DB):C4+G4(邀約表)/G5(招募表)/S5(推薦 Gate)/S7(補課 credit)
- 第 3 批(批α 工程後):P2/C7/G8/S2 條款卡(參數系統)+C5 遲到 RPC+G6 cascade+P3 pass Gate+C2 每堂價(批δ)
每畫面驗收三關(全過才算完):①flag 開/關各跑 flutter test 全綠+對應 scenario 進測試地圖;②醒目度檢查:有 A 級元素、solid 鈕 ≤2、每表單欄位有預設值且無多餘打字;③dogfood:實機點得到→真讀寫→跟 prototype 行為一致。
參照鏈:行為有疑義 → prototype 為準;規則有疑義 → 架構報告+docs/Arena_流程邏輯圖.md §9;拍板數字 → 報告第 4 章參數表。