Commit Graph
29 Commits
Author SHA1 Message Date
JianMiauandClaude Fable 5 6f38c155f0 功能:首頁改為 V2 場地排程,載入與手動產生皆為 2 場地各 8 局並依實力配對
摘要:
- 從資料庫讀取 match-hub V2 資料(battlecombination 以場地為 key)時,
  顯示「2 號場地」「3 號場地」各 8 局賽程,挑一個場地帶進記分板
- 手動分組移除 A / B 區,改為「今日出席名單」+「其他區名單」,
  演算法移植 match-hub V2:依 tg_members.skill 實力強弱互補、兩隊平衡,
  搭檔輪完一遍前不重複、每人局數落差最多 1 局;8 人以上排兩場地
- server 新增 GET /api/skills(表名可用 DB_MEMBERS_TABLE 覆寫)
- 選隊面板預設隊伍照局分組並顯示局數標題;修正帶入現有對戰時
  第 2 隊不顯示「已放入」且點擊無法取消的問題(配對比對改為不分順序)
- 舊 V1 三輪資料(personnel 含 B 區)仍照「第 N 組」顯示,自動判別

根本原因:
- 實際打球流程是 2、3 號場地各打 8 局、每局換搭檔輪休,
  舊的三輪配對制不符流程,也完全沒考慮實力;
  選隊面板的隊伍比對寫死正序,帶入現有對戰時右隊兩人反序就對不上

影響:
- 首頁載入與手動產生的結果格式一致(N 號場地 × 8 局),操作流程不變
- 舊版 A / B 區的 localStorage 內容自動合併進今日出席名單

修法:
- match.ts 移除跨區平衡三輪邏輯,移植 buildSchedule/pickBestMatching 等演算法,
  新增 buildCourtGroups 輸出場地格式;RoundGroup 增加 label
- convertDbRecordToGroups 依 personnel 是否含 B 區自動分流 V1 / V2
- ScoreboardPage 的 getPresetTeamSelectionSlot / removePresetTeamFromDraft
  改為兩人同隊即成立、不看順序

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 12:19:53 +08:00
JianMiauandClaude Fable 5 6ae1eda7e2 功能:選隊面板新增「同步今日場次」,從 history 表撈今天資料覆蓋本機場次
摘要:
- 選隊伍面板新增「同步今日場次」按鈕,按下後把每個人的今日場次更新成 DB 的數字
- 後端新增 GET /api/history/play-counts?from=&to=,回傳區間內每人上場場數與比賽數
- 按鈕上方顯示同步結果或錯誤訊息;手機版同步按鈕獨占一列

根本原因:
- 今日場次只存在本機 localStorage,跨裝置記分時其他裝置上傳的場次本機看不到,
  自動選擇與「今日 N 場」提示就不準

影響:
- 任一裝置按同步後,今日場次會與 DB history 表一致(以 DB 為準,覆蓋本機)
- 輪空/那個等佔位字不計場次

修法:
- server.mjs 新增 play-counts 端點,依 time 區間查 history.players 累計
- api.ts 新增 loadHistoryPlayCounts;App.tsx 以本機時區當天 00:00 起算 24 小時區間並 setPlayCounts
- ScoreboardPage 加入同步狀態與按鈕,App.css 調整按鈕列為三欄、≤720px 改兩列

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-18 11:33:54 +08:00
JianMiauandClaude Fable 5 d53ebbd3a8 功能:出席率統計改以 attendance 表(TG 報名名單)為資料來源
摘要:
- 出席統計改讀 attendance 表(每天每人一列),依 poll_date 分組後餵給原本的統計函式
- 新增 DB_ATTENDANCE_TABLE 環境變數,預設 attendance;沒有此表時退回 badminton 分組名單
- 前端說明文字與 README 更新來源說明

根本原因:
- 原本用 badminton 表的每日分組名單,只有名單存進 DB 的日子才有資料,
  當天報名還沒存名單就統計不到,名字寫法也要靠別名表修補

影響:
- 統計天數 121 → 126 天,含當天報名尚未分組的場次
- 名字寫法在 attendance 表已統一,別名合併(卡森→景涵 等)仍生效

修法:
- server.mjs 新增 loadAttendanceDays(),buildAttendanceStats() 改吃 [{ time, names }]
- .env.example / docker-compose.yml / README 補上 DB_ATTENDANCE_TABLE

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 13:50:59 +08:00
JianMiauandClaude Opus 4.8 710d04bffe 功能:新增出席率統計,含每日人數分析分頁與名字別名合併
根本原因:
歷史戰績只有逐場比賽紀錄,看不出每個人長期的出席狀況,也不知道每天平均來幾個人;且名單上同一人有多種寫法(大小寫、錯字),直接統計會被拆成多個人而失真。

影響:
歷史戰績頁新增「出席率統計」按鈕,彈窗含兩個分頁——「出席排行」顯示每人出席場次、全期/加入後出席率長條與最近 12 場到場數;「每日人數」顯示全期與最近平均、單場最多最少、年度平均人數、人數分佈與最近 12 場逐日人數。名字自動正規化:英文大小寫視為同一人,中文錯字用別名表合併(景函、卡森→景涵,振華→振驊,阿翔→昱翔),佔位字(輪空、那個、隨機)不列入統計,平均每場人數也一併排除佔位字。

修法:
後端新增 GET /api/attendance,從 badminton 表的每日分組名單統計(history 表只有記分場次會漏算出席),buildAttendanceStats 輸出球員列表、dailyCounts 與含年度平均的 yearTotals;前端 HistoryPage 新增 AttendanceModal 與分頁切換,App.css 補上排行長條與每日分析的樣式。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-10 15:21:37 +08:00
JianMiauandClaude Fable 5 1bc42f5bf6 功能:SSL 憑證過期偵測與提醒、歷史戰績改為分頁載入
根本原因:
1. 憑證過期時瀏覽器只回 Failed to fetch,前端無法辨識原因,使用者誤以為是 DB 連不上(本次 7/1 憑證過期即是如此)。
2. 歷史戰績一次撈出全部資料(400+ 筆、逾 100KB),筆數持續成長會越來越慢。

影響:所有 API 的連線錯誤訊息、歷史戰績頁載入速度、Docker 憑證掛載路徑與檔名。

修法:
- 後端讀取 cert.pem 到期日(60 秒快取),由 /api/version 與 /api/health 回傳 certNotAfter
- 前端把到期日存進 localStorage;fetch 失敗時依離線、憑證已過期、其他連線問題分別顯示明確訊息
- 憑證到期前 7 天於頁面跳出「SSL 憑證提醒」通知,可手動關閉
- /api/history 支援 page/pageSize(預設 20 筆、上限 100),回傳 total 與 totalPages
- 歷史戰績頁加入分頁控制列(上一頁/頁碼含省略號/下一頁/總筆數),刪除後自動重新載入並修正超出範圍的頁碼
- 憑證掛載目錄改為 /volume1/docker/certs,檔名改為 cert.pem / chain.pem / privkey.pem,app 容器同步掛載以讀取到期日

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 15:44:44 +08:00
JianMiau 30a8e1a44c 調整記分板手機滿版模式並更新說明 2026-04-28 18:17:41 +08:00
JianMiau f3e51ea83d 調整發球鏡像規則並更新說明文件 2026-04-28 08:52:47 +08:00
JianMiau edab74f125 強化房間清理與比賽中分頁限制 2026-04-19 18:05:33 +08:00
JianMiau ab3647587e 調整結算通知與全站防選字 2026-04-19 12:54:18 +08:00
JianMiau 896c24547b 新增即時觀戰房間並整理 README 2026-04-19 12:46:59 +08:00
JianMiau c097ceb9ad 更新圖示與部署更新機制並整理 README 2026-04-16 20:35:31 +08:00
JianMiau 36a39f0b8f 調整比賽結算長按回饋並更新 README 2026-04-16 20:06:26 +08:00
JianMiau 975732017f 新增 PWA 更新提示並整理 README 2026-04-16 19:57:08 +08:00
JianMiau 0cfcdc3b0a 調整歷史戰績刪除提示並更新 README 2026-04-16 18:14:56 +08:00
JianMiau d5fee1d299 補上歷史戰績刪除二次確認 2026-04-16 17:22:23 +08:00
JianMiau b2494fff17 調整語音設定介面並更新 README 2026-04-16 17:11:11 +08:00
JianMiau 860e7adc0e 新增連勝與獲勝特效並更新 README 2026-04-16 16:54:59 +08:00
JianMiau b3809b5d4f 補上先攻勾選顯示並更新 README 2026-04-16 16:49:02 +08:00
JianMiau af7ebda9f4 新增歷史戰績關閉按鈕並更新 README 2026-04-16 15:23:09 +08:00
JianMiau f50b11600e 調整分組卡片版面並更新 README 2026-04-16 14:37:32 +08:00
JianMiau 4a66f37e1f 調整選隊伍頁操作並更新 README 2026-04-16 12:37:38 +08:00
JianMiau 98c289ea5b 精簡選隊伍頁提示並更新 README 2026-04-16 10:55:41 +08:00
JianMiau bbedb70e7e 新增歷史戰績刪除功能並更新 README 2026-04-16 10:26:58 +08:00
JianMiau 31168e830b 整理設定隊伍介面並更新 README 2026-04-16 10:19:23 +08:00
JianMiau e903d3ae52 調整歷史戰績彈窗顯示文字 2026-04-16 07:48:15 +08:00
JianMiau 7a8436db47 調整 Docker SSL 入口與部署說明 2026-04-15 23:15:52 +08:00
JianMiau b0908b4d3c 補上歷史戰績列表與 NAS 部署說明 2026-04-15 23:04:16 +08:00
JianMiau 7fc8e2698b Refine scoreboard flow and update ports 2026-04-15 22:56:50 +08:00
JianMiau 8f4411d97e chore: initialize Vite React TypeScript app 2026-04-15 16:55:54 +08:00