Skip to content

Commit 02748aa

Browse files
2
1 parent 22fbe25 commit 02748aa

9 files changed

Lines changed: 881 additions & 689 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ state.json
4242
!requirements.txt
4343
!package.json
4444
!manifest.json
45+
!IMPLEMENTATION_PLAN.md
4546
# Exclude specific JSONs but allow config templates if any
4647

4748
# Large Files

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ EXPOSE 5000
1818
# Use gunicorn for production
1919
# --timeout 120: Playwright operations (login, fetching grades) can take time
2020
# --workers 2: Keep low since Playwright is memory-intensive
21-
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--timeout", "120", "--workers", "2", "--threads", "4", "server:app"]
21+
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--timeout", "120", "--workers", "5", "--threads", "4", "server:app"]

IMPLEMENTATION_PLAN.md

Lines changed: 40 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,40 @@
1-
# 實作計畫:使用 Docker 與 Cloudflare Tunnel 發佈至公網
2-
3-
這個計畫旨在協助您將本機執行的成績查詢系統,安全地發佈到公網並綁定您的個人網域名稱。我們將使用 **Cloudflare Tunnel (Zero Trust)** 技術,這是一種無需在路由器上設定連接埠轉發(Port Forwarding)的安全方式。
4-
5-
## 為什麼選擇 Cloudflare Tunnel?
6-
1. **安全性高**:不需要在路由器打開任何連接埠(如 Port 80/443),避免家庭網路直接暴露。
7-
2. **自動 SSL**:Cloudflare 會自動處理 HTTPS 憑證,您的網站將會有安全鎖頭。
8-
3. **動態 IP 友善**:即使您的家用網路 IP 是浮動的,Tunnel 也會自動連線,不需要設定 DDNS。
9-
10-
## 前置準備
11-
1. **擁由一個網域名稱**(Domain Name)。
12-
2. **註冊 Cloudflare 帳號** 並將您的網域 Nameservers 指向 Cloudflare(託管在 Cloudflare)。
13-
14-
## 實作步驟
15-
16-
### 步驟 1: 取得 Cloudflare Tunnel Token
17-
1. 登入 [Cloudflare Zero Trust Dashboard](https://one.dash.cloudflare.com/)
18-
2. 進入 **Networks** > **Tunnels**
19-
3. 點擊 **Create a tunnel**
20-
4. 選擇 **Cloudflared** 作為連接器類型。
21-
5. 輸入 Tunnel 名稱(例如 `school-grades`)並儲存。
22-
6. 在 "Install and run a connector" 頁面,找到 Docker 的指令區塊。
23-
7. **複製 Token**:您會看到一段指令 `docker run ... --tokenEYJhIjoi....`。請只複製 `--token` 後面那長串的字串(這是您的 `TUNNEL_TOKEN`)。
24-
25-
### 步驟 2: 設定 Public Hostname
26-
1. 在同一個 Tunnel 設定頁面,點擊 **Next**
27-
2. 選擇您要綁定的網域(例如 `grades.yourdomain.com`)。
28-
3.**Service** 欄位設定:
29-
* **Type**: `HTTP`
30-
* **URL**: `app:5000` (注意:這裡是 Docker 內部的服務名稱 `app`,不是 `localhost`)
31-
4. 儲存設定。
32-
33-
### 步驟 3: 修改 docker-compose.yml
34-
我們將修改 `docker-compose.yml` 以加入 Cloudflare Tunnel 服務。
35-
36-
```yaml
37-
services:
38-
app:
39-
# ... 原有的 app 設定 ...
40-
restart: unless-stopped
41-
42-
tunnel:
43-
image: cloudflare/cloudflared:latest
44-
restart: unless-stopped
45-
command: tunnel run
46-
environment:
47-
- TUNNEL_TOKEN=${TUNNEL_TOKEN}
48-
```
49-
50-
### 步驟 4: 啟動服務
51-
1. 建立一個 `.env` 檔案,寫入您的 Token:
52-
```
53-
TUNNEL_TOKEN=您的長串Token
54-
```
55-
2. 重新啟動 Docker Compose:
56-
```bash
57-
docker-compose up -d
58-
```
59-
60-
## 驗證
61-
完成後,您就可以在瀏覽器輸入您設定的網址(如 `https://grades.yourdomain.com`)來存取您的成績查詢系統。
1+
# 登出與重載功能實作計畫
2+
3+
本計畫旨在為成績查詢系統增加登出與重載考試結構的功能,並防止使用者頻繁重載。
4+
5+
## 已完成項目
6+
7+
### 1. 後端 API (`server.py`)
8+
- **新增 `/api/logout` 端點**
9+
- 收到 POST 請求時,清除 session。
10+
- 回傳成功訊息。
11+
- **更新 `/api/structure` 端點**
12+
- 支援 `reload=true` 查詢參數。
13+
-`reload=true`,則忽略 session 中的快取,強制重新呼叫 `GradeFetcher` 抓取資料。
14+
15+
### 2. 前端介面 (`index.html`)
16+
- **更新選擇考試視窗 (`selectExamModal`)**
17+
- 在 Modal Footer 加入左側按鈕群組。
18+
- 新增「登出」按鈕 (`#logoutBtn`),樣式設為危險操作 (紅色)。
19+
- 新增「重載」按鈕 (`#reloadStructureBtn`),樣式設為次要操作 (藍色)。
20+
21+
### 3. 前端樣式 (`grades_dashboard.css`)
22+
- **新增按鈕樣式**
23+
- `.modal-btn.reload`: 藍色背景,支援 disabled 狀態與 hover 效果。
24+
- `.modal-btn.danger`: 紅色背景,用於登出等危險操作。
25+
26+
### 4. 前端邏輯 (`grades_dashboard.js`)
27+
- **登出功能**
28+
- 點擊按鈕後彈出確認視窗。
29+
- 確認後呼叫 `/api/logout`
30+
- 成功後重新整理頁面 (`location.reload()`) 以清除前端狀態。
31+
- **重載功能**
32+
- 設定 60 秒 (1分鐘) 冷卻時間。
33+
- 使用 `localStorage` 記錄上次重載時間 (`lastReloadTime`),確保重新整理後冷卻時間仍有效。
34+
- 點擊按鈕時:
35+
- 更新 `lastReloadTime`
36+
- 呼叫 `openSelectExamModal(true)`,傳入 `true` 參數以強制重載。
37+
- **冷卻倒數機制**
38+
- 開啟 Modal 時檢查冷卻狀態。
39+
- 若在冷卻中,按鈕設為 disable 並顯示倒數秒數。
40+
- 使用 `setInterval` 每秒更新顯示,Modal 關閉時清除 interval。

0 commit comments

Comments
 (0)