2026-04-19 12:46:59 +08:00
|
|
|
|
# 羽毛球記分板
|
2026-04-16 10:55:41 +08:00
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
使用 `Vite + React + TypeScript + Node.js` 製作的羽毛球記分板,支援選隊伍、即時記分、歷史戰績、PWA 安裝,以及即時房間觀戰。
|
2026-04-16 10:55:41 +08:00
|
|
|
|
|
|
|
|
|
|
## 功能
|
|
|
|
|
|
|
2026-04-16 19:57:08 +08:00
|
|
|
|
- 選隊伍
|
2026-04-19 12:46:59 +08:00
|
|
|
|
- 可依指定日期從資料庫載入分組資料。
|
|
|
|
|
|
- 若資料庫沒有當天資料,可手動輸入 A、B 區名單產生分組。
|
|
|
|
|
|
- 點選分組後可直接進入記分板。
|
|
|
|
|
|
- 記分板
|
|
|
|
|
|
- 隊伍名稱只顯示在最上方與最下方。
|
|
|
|
|
|
- 可在設定隊伍面板中逐一選人,也可快速套用預設隊伍。
|
|
|
|
|
|
- 先選到的 `1、2` 為一隊,`3、4` 為另一隊。
|
|
|
|
|
|
- 可設定本場幾分獲勝,預設為 `21` 分。
|
|
|
|
|
|
- 必須先設定先攻,才能開始記分。
|
|
|
|
|
|
- 點擊分數直接加分,不提供加一減一按鈕。
|
|
|
|
|
|
- 第一分記下後,`設定隊伍` 會切換成 `上一步`。
|
|
|
|
|
|
- 可交換上下兩隊位置,也可交換同隊左右站位。
|
|
|
|
|
|
- `比賽結算` 需長按 `1 秒` 才會觸發。
|
|
|
|
|
|
- 比分 `0:0` 時不允許觸發結算。
|
|
|
|
|
|
- 語音播報
|
|
|
|
|
|
- 可設定是否播報得分者。
|
|
|
|
|
|
- 可設定是否播報下一位發球者。
|
|
|
|
|
|
- 可調整語速,最高支援到 `10x`。
|
|
|
|
|
|
- `RURU` 會以大小寫不敏感方式播報成「嚕嚕」。
|
|
|
|
|
|
- 動畫提示
|
|
|
|
|
|
- 先攻未設定時,`先攻` 文字會有提示動畫。
|
|
|
|
|
|
- 選定先攻後,會顯示打勾讓使用者更容易辨識。
|
|
|
|
|
|
- 連勝特效:
|
|
|
|
|
|
- `3 連勝`:大殺特殺
|
|
|
|
|
|
- `4 連勝`:暴走
|
|
|
|
|
|
- `5 連勝`:無人能擋
|
|
|
|
|
|
- `6 連勝`:主宰比賽
|
|
|
|
|
|
- `7 連勝`:像神一般的
|
|
|
|
|
|
- `8 連勝`:成為傳說
|
2026-04-16 19:57:08 +08:00
|
|
|
|
- 達到目標分數時會顯示獲勝動畫。
|
|
|
|
|
|
- 歷史戰績
|
2026-04-19 12:46:59 +08:00
|
|
|
|
- 比賽結算後可選擇是否上傳戰績到資料庫。
|
|
|
|
|
|
- 歷史戰績列表直接從資料庫 `history` 表讀取。
|
|
|
|
|
|
- 可點開查看每球得分紀錄。
|
|
|
|
|
|
- 手機上彈窗有 `X` 可快速關閉。
|
|
|
|
|
|
- 每筆戰績可刪除,刪除前會確認一次。
|
|
|
|
|
|
- 即時房間 / 觀戰
|
|
|
|
|
|
- 只要帶入隊伍進入記分板,就會自動建立一個房間。
|
|
|
|
|
|
- 記分板右側會顯示房號。
|
|
|
|
|
|
- `房間列表` 只顯示房號、隊伍、目標分數與最後更新時間,不顯示比分。
|
|
|
|
|
|
- 觀戰者進入房間後可即時看到比分,不能操作。
|
|
|
|
|
|
- 觀戰同步使用 `SSE + 輪詢備援`,降低漏分風險。
|
|
|
|
|
|
- 房主重整、離開記分板或換隊伍時,未結束房間會自動清掉。
|
|
|
|
|
|
- 達到目標分數後房間會標記結束,觀戰者會看到獲勝彈窗,按確定後返回房間列表。
|
2026-04-16 19:57:08 +08:00
|
|
|
|
- PWA
|
|
|
|
|
|
- 可加入手機主畫面,像 App 一樣開啟。
|
2026-04-19 12:46:59 +08:00
|
|
|
|
- 支援自訂網站 icon / PWA icon。
|
|
|
|
|
|
- 新版本部署後會顯示更新提示,可直接重新整理套用新版。
|
2026-04-16 19:57:08 +08:00
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
## 開發環境
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
2026-04-16 10:55:41 +08:00
|
|
|
|
### Port
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
2026-04-16 19:57:08 +08:00
|
|
|
|
- Client:`3501`
|
|
|
|
|
|
- Server:`8788`
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-16 10:55:41 +08:00
|
|
|
|
### 安裝
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npm install
|
2026-04-15 22:56:50 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
### 啟動開發模式
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-04-15 16:55:54 +08:00
|
|
|
|
npm run dev
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
啟動後:
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-16 10:55:41 +08:00
|
|
|
|
- 前端:`http://localhost:3501`
|
|
|
|
|
|
- API:`http://localhost:8788`
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
### 建置與檢查
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
```bash
|
|
|
|
|
|
npm run lint
|
2026-04-16 10:55:41 +08:00
|
|
|
|
npm run build
|
2026-04-16 10:19:23 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-16 10:55:41 +08:00
|
|
|
|
## 環境變數
|
2026-04-16 10:19:23 +08:00
|
|
|
|
|
2026-04-16 19:57:08 +08:00
|
|
|
|
請在專案根目錄建立 `.env`:
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
|
|
|
|
|
```env
|
2026-04-16 10:55:41 +08:00
|
|
|
|
DB_HOST=127.0.0.1
|
|
|
|
|
|
DB_PORT=3306
|
|
|
|
|
|
DB_USER=root
|
|
|
|
|
|
DB_PASSWORD=your_password
|
2026-04-15 22:56:50 +08:00
|
|
|
|
DB_DATABASE=badminton
|
2026-04-16 19:57:08 +08:00
|
|
|
|
DB_TABLE=badminton
|
2026-04-15 22:56:50 +08:00
|
|
|
|
DB_HISTORY_TABLE=history
|
2026-04-16 10:55:41 +08:00
|
|
|
|
PORT=8788
|
2026-04-15 16:55:54 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-16 10:55:41 +08:00
|
|
|
|
## Docker / NAS 部署
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
正式部署時:
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
- App 內部服務 port:`8788`
|
|
|
|
|
|
- 對外 HTTPS 入口:`3501`
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
部署指令:
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-04-16 10:55:41 +08:00
|
|
|
|
sudo docker compose up -d --build
|
2026-04-15 16:55:54 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
部署完成後,對外入口為:
|
2026-04-16 10:19:23 +08:00
|
|
|
|
|
2026-04-16 10:55:41 +08:00
|
|
|
|
```text
|
|
|
|
|
|
https://你的網域或 NAS IP:3501
|
2026-04-15 23:04:16 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
每次執行 `sudo docker compose up -d --build`,容器都會更新啟動版號,已安裝 PWA 的裝置會在偵測到新版本後顯示更新提示。
|
2026-04-16 20:35:31 +08:00
|
|
|
|
|
2026-04-16 10:55:41 +08:00
|
|
|
|
## SSL 憑證目錄
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
2026-04-16 19:57:08 +08:00
|
|
|
|
Docker Compose 會直接掛載 NAS 上的憑證目錄:
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
/volume1/homes/JianMiau/www/certificate/
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
預設使用以下檔案:
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
|
|
|
|
|
- `RSA-cert.pem`
|
|
|
|
|
|
- `RSA-chain.pem`
|
|
|
|
|
|
- `RSA-privkey.pem`
|
|
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
之後只要更新這個資料夾內的憑證檔即可,不需要重建 image。
|
2026-04-16 19:57:08 +08:00
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
## 資料表格式
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
### `history`
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
2026-04-16 10:55:41 +08:00
|
|
|
|
- `id`
|
|
|
|
|
|
- `time`
|
|
|
|
|
|
- `dayOfWeek`
|
|
|
|
|
|
- `score`
|
|
|
|
|
|
- `winScore`
|
|
|
|
|
|
- `type`
|
|
|
|
|
|
- `0`:雙打
|
|
|
|
|
|
- `1`:單打
|
|
|
|
|
|
- `players`
|
2026-04-19 12:46:59 +08:00
|
|
|
|
- 依 `1 ~ 4` 編號排序的玩家陣列
|
2026-04-16 10:55:41 +08:00
|
|
|
|
- `team`
|
2026-04-19 12:46:59 +08:00
|
|
|
|
- `1、2` 為一隊
|
|
|
|
|
|
- `3、4` 為一隊
|
2026-04-16 10:55:41 +08:00
|
|
|
|
- `scoreList`
|
|
|
|
|
|
- 格式:`[round, 發球者編號, 連勝次數, 得分隊伍(0 或 1)]`
|
2026-04-15 23:04:16 +08:00
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
## PWA 圖示
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
2026-04-19 12:46:59 +08:00
|
|
|
|
目前網站 icon 與 PWA icon 來源為:
|
|
|
|
|
|
|
|
|
|
|
|
- `public/favicon.png`
|
|
|
|
|
|
- `public/apple-touch-icon.png`
|
|
|
|
|
|
- `public/pwa-192.png`
|
|
|
|
|
|
- `public/pwa-512.png`
|
|
|
|
|
|
|
|
|
|
|
|
## Git 中文設定
|
|
|
|
|
|
|
|
|
|
|
|
建議設定 git 使用 UTF-8,避免中文 commit 或 log 顯示異常:
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
2026-04-16 10:55:41 +08:00
|
|
|
|
```bash
|
|
|
|
|
|
git config i18n.commitEncoding utf-8
|
|
|
|
|
|
git config i18n.logOutputEncoding utf-8
|
|
|
|
|
|
git config core.quotepath false
|
2026-04-15 16:55:54 +08:00
|
|
|
|
```
|