2026-04-15 22:56:50 +08:00
|
|
|
|
# badminton-scoreboard
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
羽毛球記分板系統,使用 `Vite + React + TypeScript` 建立前端,搭配 `Express + MySQL` 提供資料讀寫 API。
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
目前專案包含三個主要頁面:
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
- `選隊伍`:可依指定日期從 DB 載入隊伍資料,若沒有資料可改用手動配對
|
|
|
|
|
|
- `記分板`:支援先攻設定、直接點分數記分、上一步回退、上下換隊、左右換位
|
2026-04-16 10:26:58 +08:00
|
|
|
|
- `歷史戰績`:直接從 DB 的 `history` 表讀取戰績列表,點開可看得分紀錄,也能直接刪除單筆紀錄
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
## 目前記分板流程
|
|
|
|
|
|
|
|
|
|
|
|
- 進入記分板前,先從選隊伍頁面選定「第幾組」
|
|
|
|
|
|
- 點 `設定隊伍` 後會打開雙欄彈窗
|
|
|
|
|
|
- 左邊可一個一個選球員,依照順序自動成隊:
|
|
|
|
|
|
- 第 1、2 位成上方隊伍
|
|
|
|
|
|
- 第 3、4 位成下方隊伍
|
|
|
|
|
|
- 右邊可直接快速選預設好的隊伍
|
|
|
|
|
|
- 可設定 `幾分獲勝`,預設是 `21`
|
|
|
|
|
|
- 確認配隊後會直接帶入記分板並重設本場狀態
|
|
|
|
|
|
- 開始記分後,`設定隊伍` 會改成 `上一步`
|
|
|
|
|
|
|
|
|
|
|
|
## 手機版設計方向
|
|
|
|
|
|
|
|
|
|
|
|
- 以手機完整顯示為優先
|
|
|
|
|
|
- 記分板主畫面盡量避免整頁上下滑動
|
|
|
|
|
|
- 設定隊伍彈窗會優先壓縮內容高度
|
|
|
|
|
|
- 若名單較多,改為彈窗內局部捲動,不影響整頁閱讀
|
|
|
|
|
|
|
2026-04-16 10:26:58 +08:00
|
|
|
|
## 歷史戰績功能
|
|
|
|
|
|
|
|
|
|
|
|
- 歷史列表直接從 DB 的 `history` 表讀取
|
|
|
|
|
|
- 點列表卡片可查看得分過程
|
|
|
|
|
|
- 每筆列表右側都有 `刪除此筆` 按鈕
|
|
|
|
|
|
- 刪除前會跳出確認視窗
|
|
|
|
|
|
- 刪除成功後列表會即時更新
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
## Port 設定
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
|
|
|
|
|
### 本機開發
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
- Client:`3501`
|
|
|
|
|
|
- Server API:`8788`
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
啟動後:
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-15 23:04:16 +08:00
|
|
|
|
- 前端:`http://localhost:3501`
|
|
|
|
|
|
- API:`http://localhost:8788`
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-15 23:15:52 +08:00
|
|
|
|
### Docker / NAS 部署
|
|
|
|
|
|
|
|
|
|
|
|
- 對外入口:`3501`
|
2026-04-16 10:19:23 +08:00
|
|
|
|
- Node app 內部 port:`8788`
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
正式部署時,外部會走 Nginx SSL 入口,使用 `3501`;`8788` 只提供容器內部反向代理使用。
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
2026-04-15 23:04:16 +08:00
|
|
|
|
## 本機開發
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-15 23:04:16 +08:00
|
|
|
|
安裝套件:
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npm install
|
2026-04-15 22:56:50 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
啟動開發環境:
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-04-15 16:55:54 +08:00
|
|
|
|
npm run dev
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
會同時啟動:
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
|
|
|
|
|
- Vite client on `3501`
|
|
|
|
|
|
- Node server on `8788`
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
## 建置與檢查
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
```bash
|
|
|
|
|
|
npm run build
|
|
|
|
|
|
```
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
```bash
|
|
|
|
|
|
npm run lint
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## `.env` 範例
|
|
|
|
|
|
|
|
|
|
|
|
請參考 [.env.example](./.env.example):
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
|
|
|
|
|
```env
|
|
|
|
|
|
DB_HOST=192.168.0.15
|
|
|
|
|
|
DB_PORT=3307
|
|
|
|
|
|
DB_USER=jianmiau
|
|
|
|
|
|
DB_PASSWORD=your-password
|
|
|
|
|
|
DB_DATABASE=badminton
|
|
|
|
|
|
DB_TABLE=badminton
|
|
|
|
|
|
DB_HISTORY_TABLE=history
|
|
|
|
|
|
SERVER_PORT=8788
|
2026-04-15 23:15:52 +08:00
|
|
|
|
NGINX_SERVER_NAME=_
|
|
|
|
|
|
SSL_CERT_FILE_NAME=RSA-cert.pem
|
|
|
|
|
|
SSL_CHAIN_FILE_NAME=RSA-chain.pem
|
|
|
|
|
|
SSL_KEY_FILE_NAME=RSA-privkey.pem
|
2026-04-15 22:56:50 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
## 資料表格式
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
|
|
|
|
|
### `badminton`
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
- `time`:日期鍵值,格式 `YYYYMMDD`
|
|
|
|
|
|
- `personnel`:球員名單 JSON
|
|
|
|
|
|
- `battlecombination`:各組配對 JSON
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
|
|
|
|
|
### `history`
|
|
|
|
|
|
|
|
|
|
|
|
- `id`
|
|
|
|
|
|
- `time`
|
|
|
|
|
|
- `dayOfWeek`
|
|
|
|
|
|
- `score`
|
|
|
|
|
|
- `winScore`
|
|
|
|
|
|
- `type`
|
|
|
|
|
|
- `players`
|
|
|
|
|
|
- `team`
|
|
|
|
|
|
- `scoreList`
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
`scoreList` 格式:
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
|
|
|
|
|
```text
|
2026-04-15 22:56:50 +08:00
|
|
|
|
[round, starter, winCount, winner]
|
2026-04-15 16:55:54 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
說明:
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-16 07:48:15 +08:00
|
|
|
|
- `round`:第幾球
|
2026-04-16 10:19:23 +08:00
|
|
|
|
- `starter`:發球者編號
|
|
|
|
|
|
- `winCount`:連勝次數
|
|
|
|
|
|
- `winner`:`0` 代表上方隊伍得分,`1` 代表下方隊伍得分
|
2026-04-15 22:56:50 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
## Docker 建置
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
單獨建置 Node app:
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
docker build -t badminton-scoreboard .
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-15 23:04:16 +08:00
|
|
|
|
## NAS 部署
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
專案已提供 [docker-compose.yml](./docker-compose.yml)。
|
|
|
|
|
|
|
|
|
|
|
|
服務包含:
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
|
|
|
|
|
1. `badminton-scoreboard`
|
2026-04-16 10:19:23 +08:00
|
|
|
|
Node app,內部使用 `8788`
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
|
|
|
|
|
2. `badminton-scoreboard-web`
|
2026-04-16 10:19:23 +08:00
|
|
|
|
Nginx SSL 入口,對外使用 `3501`
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
在 NAS 專案目錄執行:
|
2026-04-15 23:04:16 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
sudo docker compose up -d --build
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-15 23:15:52 +08:00
|
|
|
|
## SSL 憑證掛載
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
SSL 憑證目錄固定使用:
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
/volume1/homes/JianMiau/www/certificate/
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
預設檔名:
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
|
|
|
|
|
- `RSA-cert.pem`
|
|
|
|
|
|
- `RSA-chain.pem`
|
|
|
|
|
|
- `RSA-privkey.pem`
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
Nginx 會自動組合:
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
|
|
|
|
|
- `RSA-cert.pem` + `RSA-chain.pem` => fullchain
|
|
|
|
|
|
- `RSA-privkey.pem` => private key
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
之後只要更新:
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
/volume1/homes/JianMiau/www/certificate/
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
容器內的 Nginx 就會重新載入,不需要重建 image。
|
2026-04-15 23:04:16 +08:00
|
|
|
|
|
2026-04-15 23:15:52 +08:00
|
|
|
|
## NAS 對外入口
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
部署完成後可由:
|
2026-04-15 16:55:54 +08:00
|
|
|
|
|
|
|
|
|
|
```text
|
2026-04-16 10:19:23 +08:00
|
|
|
|
https://你的網域或IP:3501
|
2026-04-15 16:55:54 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
進入系統。
|
2026-04-15 23:15:52 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
## Git 中文設定
|
2026-04-15 23:04:16 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
目前 repo 已設定:
|
2026-04-15 23:04:16 +08:00
|
|
|
|
|
2026-04-15 23:15:52 +08:00
|
|
|
|
- `i18n.commitEncoding=utf-8`
|
|
|
|
|
|
- `i18n.logOutputEncoding=utf-8`
|
|
|
|
|
|
- `core.quotepath=false`
|
2026-04-15 23:04:16 +08:00
|
|
|
|
|
2026-04-16 10:19:23 +08:00
|
|
|
|
之後使用中文 commit 訊息與 `git log` 會比較正常。
|