` 容器**分組相關元素
+- **用 `for` 與 `id` 屬性**關聯標籤與輸入
+- **加入現代屬性**如 `autocomplete` 和 `placeholder` 改善使用者體驗
+- **加上 `novalidate`**,改由 JavaScript 處理驗證,而非瀏覽器預設
+
+### 正確標籤的重要性
+
+**為何標籤對現代網頁開發很重要:**
+
+```mermaid
+graph TD
+ A[標籤元素] --> B[螢幕閱讀器支援]
+ A --> C[點擊目標擴大]
+ A --> D[表單驗證]
+ A --> E[SEO 益處]
+
+ B --> F[所有用戶可達]
+ C --> G[更佳的手機體驗]
+ D --> H[清晰的錯誤訊息]
+ E --> I[更好的搜尋排名]
+```
+**正確標籤的作用:**
+- **讓螢幕閱讀器清楚宣告表格欄位**
+- **擴大點擊區域(點擊標籤可聚焦輸入欄位)**
+- **提升行動裝置使用體驗,觸控目標更大**
+- **支援更有意義的錯誤訊息驗證**
+- **增強 SEO,提供表格元素語意**
-- 通過將標籤與表單控制項關聯,可以幫助使用輔助技術(如螢幕閱讀器)的使用者了解他們需要提供哪些資料。
-- 您可以點擊標籤直接將焦點放在相關的輸入欄位上,這使得在觸控螢幕設備上更容易操作。
+> 🎯 **無障礙目標**:每個輸入都應有相對應標籤。這個簡單做法讓你的表格對所有人都更友善,包括有障礙的使用者,並提升整體使用體驗。
-> [網頁無障礙性](https://developer.mozilla.org/docs/Learn/Accessibility/What_is_accessibility)是一個經常被忽視但非常重要的主題。得益於[語義化 HTML 元素](https://developer.mozilla.org/docs/Learn/Accessibility/HTML),如果正確使用它們,創建無障礙內容並不困難。您可以[閱讀更多關於無障礙性的內容](https://developer.mozilla.org/docs/Web/Accessibility),以避免常見錯誤並成為一名負責任的開發者。
+### 建立註冊表格
-現在,我們將在前一個表單下方新增第二個註冊表單:
+註冊表格需要填寫較多詳細資料來建立完整帳號。讓我們用現代 HTML5 功能及加強無障礙性來建立它。
```html
```
-使用 `value` 屬性,我們可以為給定的輸入欄位定義預設值。
-另外,請注意 `balance` 的輸入欄位使用了 `number` 類型。它看起來是否與其他輸入欄位不同?試著與它互動看看。
+**上述代碼中,我們:**
+- **將每個欄位置於容器 `
` 中**以便更好地調整樣式和版面
+- **加入適當的 `autocomplete` 屬性**以支援瀏覽器自動填入
+- **包含實用的 placeholder 文字**指引用戶輸入
+- **使用 `value` 設定合理預設值**
+- **套用驗證屬性**如 `required`、`maxlength` 和 `min`
+- **balance 欄位使用 `type="number"`**且支援小數點
+
+### 探索輸入類型與行為
+
+**現代輸入類型帶來的功能強化:**
+
+| 功能 | 好處 | 範例 |
+|---------|---------|----------|
+| `type="number"` | 行動裝置數字鍵盤 | 較易輸入餘額 |
+| `step="0.01"` | 小數點精度控制 | 支援貨幣分角 |
+| `autocomplete` | 瀏覽器自動填入 | 更快填表 |
+| `placeholder` | 背景提示 | 指導使用者預期 |
-✅ 您能僅使用鍵盤導航並與表單互動嗎?您會如何操作?
+> 🎯 **無障礙挑戰**:嘗試僅用鍵盤操作表格!用 `Tab` 鍵移動欄位,`Space` 勾選多選框,`Enter` 送出。這可幫助你理解螢幕閱讀器使用者的互動模式。
-## 將資料提交到伺服器
+### 🔄 **學習進度檢查**
+**表格基礎理解**:在實作 JavaScript 前,請確保你知道:
+- ✅ 怎樣用語義化 HTML 建立無障礙表格結構
+- ✅ 輸入類型對行動鍵盤與驗證的重要性
+- ✅ 標籤與表格控制元件的相互關係
+- ✅ 表格屬性如何影響瀏覽器預設行為
-現在我們有了一個功能性 UI,下一步是將資料發送到伺服器。讓我們使用當前的程式碼進行快速測試:如果您點擊*登入*或*註冊*按鈕會發生什麼?
+**自我檢測題**:若沒有 JavaScript 管理,送出表格會發生什麼事?
+*答案:瀏覽器進行預設提交,通常跳轉至 action 指定的 URL*
-您是否注意到瀏覽器的 URL 區域發生了變化?
+**HTML5 表格好處**:現代表格提供:
+- **內建驗證**:自動檢查電郵及數字格式
+- **行動優化**:依輸入類型調整鍵盤
+- **無障礙**:支援螢幕閱讀器和鍵盤導航
+- **漸進增強**:即使無 JavaScript 也可正常使用
-
+## 理解表格提交方式
-`
```
-現在,如果你按下 *註冊* 按鈕,而某個欄位未遵守我們定義的驗證規則,你應該會看到類似以下的提示:
+**理解此強化驗證:**
+- **結合** 必填欄位標示與說明文字
+- **加入** `pattern` 屬性做格式驗證
+- **附加** `title` 屬性供無障礙與工具提示
+- **增加** 輔助文本指導使用者輸入
+- **使用** 語意化 HTML 結構提升存取性
+
+### 進階驗證規則
+
+**各檢核規則意義:**
+
+| 欄位 | 驗證規則 | 使用者利益 |
+|-------|------------------|--------------|
+| 使用者名稱 | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | 確保有效且唯一的標識 |
+| 貨幣 | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | 接受常見貨幣符號 |
+| 帳戶餘額 | `min="0"`, `step="0.01"`, `type="number"` | 防止負餘額 |
+| 描述 | `maxlength="100"` | 合理長度限制 |
+
+### 測試驗證行為
+
+**試試這些驗證場景:**
+1. **送出** 留空必填欄位
+2. **使用** 少於 3 個字元的使用者名稱
+3. **嘗試** 在使用者名稱內輸入特殊字元
+4. **輸入** 負數餘額金額
+
+
+
+**你會觀察到:**
+- **瀏覽器呈現** 原生驗證訊息
+- **樣式變化** 隨 `:valid` 和 `:invalid` 狀態變動
+- **禁止表單送出** 直到所有驗證通過
+- **焦點自動移至** 第一個無效欄位
+
+### 客戶端與伺服器端驗證
+
+```mermaid
+graph LR
+ A[客戶端驗證] --> B[即時反饋]
+ A --> C[更佳用戶體驗]
+ A --> D[減輕伺服器負擔]
+
+ E[伺服器端驗證] --> F[安全性]
+ E --> G[數據完整性]
+ E --> H[業務規則]
+
+ A -.-> I[兩者均需]
+ E -.-> I
+```
+**你為何需要雙層驗證:**
+- **客戶端驗證**:即時回饋並提升用戶體驗
+- **伺服器端驗證**:保證安全並處理複雜商業規則
+- **雙管齊下**:打造強健、用戶友善又安全的應用
+- **漸進增強**:即便停用 JavaScript 仍可運作
+
+> 🛡️ **安全提醒**:切勿只信任客戶端驗證!惡意使用者可繞過客戶端檢查,所以伺服器端驗證對安全與資料完整至關重要。
+
+### ⚡ **接下來 5 分鐘你可以做什麼**
+- [ ] 用錯誤資料測試表單,查看驗證訊息
+- [ ] 嘗試關閉 JavaScript 後,提交表單體驗 HTML5 驗證
+- [ ] 開啟瀏覽器開發工具,檢查送往伺服器的表單資料
+- [ ] 嘗試多種輸入類型,觀察手機鍵盤變化
+
+### 🎯 **本時段你能完成什麼**
+- [ ] 完成本堂測驗,理解表單處理概念
+- [ ] 實作全面驗證挑戰,加強即時回饋
+- [ ] 添加 CSS 樣式,打造專業表單外觀
+- [ ] 創建錯誤處理邏輯,應對重複用戶名與伺服器錯誤
+- [ ] 新增密碼確認欄位及對應驗證
+
+### 📅 **為期一週的表單精修旅程**
+- [ ] 完成進階功能齊全的銀行應用表單
+- [ ] 實作個人資料或文件上傳功能
+- [ ] 加入多步驟表單,含進度指標與狀態管理
+- [ ] 創建依用戶選擇動態變化的表單
+- [ ] 實現表單自動保存與恢復提升體驗
+- [ ] 實作進階驗證如 Email 驗證與電話格式化
+
+### 🌟 **你的一個月前端表單開發精通**
+- [ ] 開發具條件邏輯與工作流程的複雜表單應用
+- [ ] 學習表單庫與框架加速開發
+- [ ] 精通無障礙指引與包容性設計原則
+- [ ] 實現國際化與本地化的全球化表單
+- [ ] 創建可重用表單元件庫與設計系統
+- [ ] 貢獻開源表單專案並分享最佳實踐
+
+## 🎯 你的表單開發精通時程
+
+```mermaid
+timeline
+ title 表單開發與使用者體驗學習進度
+
+ section HTML 基礎 (15 分鐘)
+ 語義表單: 表單元素
+ : 輸入類型
+ : 標籤與無障礙
+ : 漸進式增強
+
+ section JavaScript 整合 (25 分鐘)
+ 事件處理: 表單提交
+ : 資料收集
+ : AJAX 通訊
+ : 非同步/等待模式
+
+ section 驗證系統 (35 分鐘)
+ 多層安全: HTML5 驗證
+ : 客戶端邏輯
+ : 伺服器端驗證
+ : 錯誤處理
+
+ section 使用者體驗 (45 分鐘)
+ 介面美化: 載入狀態
+ : 成功訊息
+ : 錯誤恢復
+ : 無障礙功能
+
+ section 進階模式 (1 週)
+ 專業表單: 動態驗證
+ : 多步驟工作流程
+ : 檔案上傳
+ : 即時反饋
+
+ section 企業技能 (1 個月)
+ 生產應用: 表單函式庫
+ : 測試策略
+ : 效能優化
+ : 安全最佳實務
+```
+### 🛠️ 你的表單開發工具包總結
+
+學完本課程,你已掌握:
+- **HTML5 表單**:語意結構、輸入類型與無障礙功能
+- **JavaScript 表單處理**:事件管理、資料收集及 AJAX 通訊
+- **驗證架構**:多層驗證保障安全與使用者體驗
+- **非同步程式設計**:現代 fetch API 與 async/await 模式
+- **錯誤管理**:全面錯誤處理與用戶回饋系統
+- **使用者體驗設計**:加載狀態、成功訊息及錯誤復原
+- **漸進增強**:跨瀏覽器與能耐皆適用之表單
+
+**實務應用**:你的表單開發技能直接適用於:
+- **電子商務**:結帳流程、帳戶註冊與付款表單
+- **企業軟體**:資料輸入系統、報表介面與工作流程應用
+- **內容管理**:發佈平台、用戶產生內容與管理介面
+- **金融應用**:銀行介面、投資平台與交易系統
+- **醫療系統**:病患入口網站、預約排程與醫療紀錄表單
+- **教育平台**:課程註冊、評估工具與學習管理
+
+**專業技能**:你現在能:
+- **設計** 適用於所有用戶(含身障者)的可存取表單
+- **實作** 安全驗證,預防資料損毀與安全漏洞
+- **打造** 提供明確回饋與指導的響應介面
+- **除錯** 複雜表單互動,使用瀏覽器開發工具及網路分析
+- **優化** 表單效能,透過高效資料處理與驗證策略
+
+**前端開發概念精通:**
+- **事件驅動架構**:用戶交互處理與回應系統
+- **非同步程式設計**:非阻塞伺服器通訊與錯誤管理
+- **資料驗證**:客戶端與伺服器端安全完整性檢查
+- **使用者體驗設計**:引導用戶成功的直覺介面
+- **無障礙工程**:滿足多元用戶需求的包容設計
+
+**下一階段**:你已準備好探索進階表單庫、實作複雜驗證規則,或打造企業級資料蒐集系統!
+
+🌟 **成就解鎖**:你已完成一套完整表單處理系統,具備專業驗證、錯誤處理與使用者體驗模式!
-
+---
-這種在將任何數據發送到伺服器之前執行的驗證被稱為 **客戶端驗證**。但需要注意的是,並非所有檢查都能在不發送數據的情況下完成。例如,我們無法在這裡檢查是否已經存在相同用戶名的帳戶,除非向伺服器發送請求。在伺服器上執行的額外驗證被稱為 **伺服器端驗證**。
-通常需要同時實現這兩種驗證。客戶端驗證通過即時向用戶提供反饋來改善用戶體驗,而伺服器端驗證則至關重要,確保你處理的用戶數據是可靠且安全的。
---
+## GitHub Copilot Agent 挑戰 🚀
+
+使用 Agent 模式完成以下挑戰:
+
+**說明:** 強化註冊表單,實現全面的客戶端驗證與用戶回饋。此挑戰將幫助你練習表單驗證、錯誤處理與透過互動式反饋提升使用者體驗。
+**提示:** 建立一個完整的註冊表單驗證系統,包含:1) 使用者輸入時每個欄位即時驗證反饋,2) 自訂驗證訊息顯示於每個輸入欄位下方,3) 密碼確認欄位及配對驗證,4) 視覺指示器(如對有效欄位顯示綠色勾勾,對無效欄位顯示紅色警告),5) 僅在所有驗證通過後,送出按鈕才會啟用。使用 HTML5 驗證屬性、CSS 來設計驗證狀態樣式,並用 JavaScript 實作互動行為。
+
+在此了解更多關於 [agent 模式](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) 。
+
## 🚀 挑戰
-如果用戶已存在,請在 HTML 中顯示一條錯誤訊息。
+若使用者已存在,請在 HTML 顯示錯誤訊息。
-以下是一個經過一些樣式設計後的最終登錄頁面的示例:
+以下是簡單美化後的最終登入頁面範例:
-
+
-## 課後測驗
+## 課後小測驗
-[課後測驗](https://ff-quizzes.netlify.app/web/quiz/44)
+[課後小測驗](https://ff-quizzes.netlify.app/web/quiz/44)
-## 回顧與自學
+## 複習與自學
-開發者在構建表單,特別是驗證策略方面,已經變得非常有創意。通過瀏覽 [CodePen](https://codepen.com) 來了解不同的表單流程;你能找到一些有趣且具有啟發性的表單嗎?
+開發者在表單建置特別是驗證策略上很有創意。試著在 [CodePen](https://codepen.com) 上瀏覽,能否發現一些有趣且有啟發性的表單?
## 作業
-[為你的銀行應用程式設計樣式](assignment.md)
+[美化你的銀行應用程式](assignment.md)
---
+
**免責聲明**:
-此文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議使用專業的人類翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
+本文件是使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力確保準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於重要資訊,建議採用專業人工翻譯。我們對因使用本翻譯而產生的任何誤解或誤釋概不負責。
+
\ No newline at end of file
diff --git a/translations/hk/7-bank-project/2-forms/assignment.md b/translations/hk/7-bank-project/2-forms/assignment.md
index 304932fc..081901f7 100644
--- a/translations/hk/7-bank-project/2-forms/assignment.md
+++ b/translations/hk/7-bank-project/2-forms/assignment.md
@@ -1,25 +1,165 @@
-# 為你的銀行應用程式設計樣式
+# 使用現代 CSS 美化您的銀行應用程式
-## 指引
+## 專案概覽
-建立一個新的 `styles.css` 檔案,並在你現有的 `index.html` 檔案中加入一個連結到該檔案。在你剛建立的 CSS 檔案中,加入一些樣式,讓 *登入* 和 *儀表板* 頁面看起來整潔美觀。嘗試設計一個色彩主題,為你的應用程式打造專屬的品牌形象。
+將您功能完善的銀行應用程式轉化為視覺上吸引、專業外觀的網頁應用程式,使用現代 CSS 技巧。您將建立一套一致的設計系統,提高使用者體驗,同時維持可及性與響應式設計原則。
-> 提示:如果需要,你可以修改 HTML 並新增新的元素和類別。
+此任務挑戰您應用當代網頁設計模式,實施一致的視覺識別,並打造用戶既喜愛又直覺易用的介面。
+
+## 指示
+
+### 第一步:設置您的樣式表
+
+**建立您的 CSS 基礎:**
+
+1. **建立** 一個名為 `styles.css` 的新檔案於您的專案根目錄
+2. **在** `index.html` 檔案中連結此樣式表: ```html
+
+ ```
+3. **開始** 使用 CSS 重設與現代預設值:
+ ```css
+ /* Modern CSS reset and base styles */
+ * {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+
+ body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
+ line-height: 1.6;
+ color: #333;
+ }
+ ```
+
+### 第二步:設計系統需求
+
+**實作這些基本設計元素:**
+
+#### 顏色調色盤
+- **主色**:選擇專業的顏色用於按鈕和重點元素
+- **次要色**:用於強調及次要動作的互補色
+- **中性色**:用於文字、邊框及背景的灰色系
+- **成功/錯誤色**:成功狀態使用綠色,錯誤狀態使用紅色
+
+#### 排版
+- **標題階層**:清晰分辨 H1、H2 及 H3 元素
+- **正文字體**:易讀字體大小(最小 16px)及適當行高
+- **表單標籤**:清晰且可及的文字樣式
+
+#### 版面配置與間距
+- **一致間距**:使用間距刻度(8px、16px、24px、32px)
+- **格線系統**:有組織的表單及內容區塊佈局
+- **響應式設計**:以行動裝置為起點的斷點設計
+
+### 第三步:元件樣式
+
+**為這些特定元件設計樣式:**
+
+#### 表單
+- **輸入欄位**:專業邊框、聚焦狀態與驗證樣式
+- **按鈕**:懸停效果、禁用狀態及載入指示
+- **標籤**:清楚定位及必填欄位指示
+- **錯誤訊息**:顯著錯誤樣式與有用的提示訊息
+
+#### 導航
+- **頁首**:乾淨且具品牌識別的導航區域
+- **連結**:明顯的懸停狀態與啟用指示
+- **標誌/標題**:具特色的品牌元素
+
+#### 內容區域
+- **區塊**:不同區域間清晰的視覺分隔
+- **卡片**:若使用卡片式佈局,包含陰影及邊框
+- **背景**:適當運用空白及細膩背景
+
+### 第四步:進階功能(選擇性)
+
+**考慮實作這些高級功能:**
+- **暗模式**:可在亮/暗主題間切換
+- **動畫**:細緻過渡與微互動效果
+- **載入狀態**:表單提交時的視覺反饋
+- **響應式圖片**:針對不同螢幕尺寸做優化的圖片
+
+## 設計靈感
+
+**現代銀行應用特色:**
+- **乾淨、極簡設計**搭配豐富的空白
+- **專業色彩方案**(藍色、綠色或精緻的中性色)
+- **明確視覺階層**與顯著的行動呼籲按鈕
+- **達到 WCAG 準則的可及對比**
+- **適用所有裝置的響應式佈局**
+
+## 技術需求
+
+### CSS 組織架構
+```css
+/* 1. CSS Custom Properties (Variables) */
+:root {
+ --primary-color: #007bff;
+ --secondary-color: #6c757d;
+ /* Add more variables */
+}
+
+/* 2. Base Styles */
+/* Reset, typography, general elements */
+
+/* 3. Layout */
+/* Grid, flexbox, positioning */
+
+/* 4. Components */
+/* Forms, buttons, cards */
+
+/* 5. Utilities */
+/* Helper classes, responsive utilities */
+
+/* 6. Media Queries */
+/* Responsive breakpoints */
+```
+
+### 可及性需求
+- **色彩對比**:確保普通文字至少有 4.5:1 對比度
+- **聚焦指標**:鍵盤導覽可見的聚焦狀態
+- **表單標籤**:正確與輸入欄位關聯
+- **響應式設計**:適用寬度從 320px 至 1920px 的螢幕
## 評分標準
-| 評分標準 | 優異 | 合格 | 需要改進 |
-| -------- | ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------- |
-| | 所有頁面看起來整潔易讀,擁有一致的色彩主題,不同的區塊能夠清晰地突顯出來。 | 頁面有樣式,但缺乏主題,或者區塊未能清楚地劃分。 | 頁面缺乏樣式,區塊看起來雜亂無章,資訊難以閱讀。 |
+| 評分標準 | 優秀 (A) | 稱職 (B) | 有待發展 (C) | 需改進 (F) |
+|----------|----------|----------|--------------|------------|
+| **設計系統** | 實施完整設計系統,色彩、排版與間距一致 | 使用一致樣式,有明確設計模式及良好視覺階層 | 基本樣式,有些一致性問題或設計元素缺失 | 樣式極少且不一致,設計衝突 |
+| **使用者體驗** | 建立直覺、專業介面,具優異可用性與視覺吸引力 | 提供良好體驗,導航清楚,內容易讀 | 基本可用,需加強 UX | 可用性差,難以導航或閱讀 |
+| **技術實作** | 使用現代 CSS 技巧,程式結構有組織,遵守最佳實踐 | 有效運用 CSS,組織良好且技術適當 | CSS 正常運作,但組織或現代技術不足 | CSS 實作差,含技術問題或瀏覽器相容性問題 |
+| **響應式設計** | 完全響應,適用所有裝置尺寸且效果優良 | 響應良好,部分畫面大小有輕微問題 | 基本響應,部分佈局存在問題 | 無響應或行動裝置嚴重問題 |
+| **可及性** | 達 WCAG 標準,具優秀鍵盤導覽及讀屏支援 | 良好可及性,對比及聚焦指標適當 | 基本可及性考量,有少部分缺失 | 可及性差,行動不便使用者難以使用 |
+
+## 提交指南
+
+**提交內容包含:**
+- **styles.css**:您的完整樣式表
+- **更新後的 HTML**:您所修改的任何 HTML 檔
+- **截圖**:展示桌面與行動裝置上設計的圖片
+- **README**:簡述您的設計選擇與色彩調色盤
+
+**加分項目:**
+- **CSS 自訂屬性**,以維持可維護的主題化
+- **進階 CSS 功能**,如 Grid、Flexbox 或 CSS 動畫
+- **效能考量**,如優化 CSS 與檔案大小
+- **跨瀏覽器測試**,確保不同瀏覽器相容性
+
+> 💡 **專家提示**:先從行動裝置設計開始,再為大螢幕增強功能。此行動優先 (mobile-first) 方法確保您的應用程式在所有裝置上均良好運行,並遵循現代網頁開發最佳實踐。
+
+---
+
**免責聲明**:
-本文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於翻譯的準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件以其母語版本為準,應視為權威來源。對於重要資訊,建議使用專業人工翻譯。我們不對因使用此翻譯而引起的任何誤解或誤釋承擔責任。
+
\ No newline at end of file
diff --git a/translations/hk/7-bank-project/3-data/README.md b/translations/hk/7-bank-project/3-data/README.md
index 5a075154..8718fd7a 100644
--- a/translations/hk/7-bank-project/3-data/README.md
+++ b/translations/hk/7-bank-project/3-data/README.md
@@ -1,67 +1,243 @@
-# 建立銀行應用程式第 3 部分:獲取和使用數據的方法
+# 建立銀行應用程式 第3部分:擷取及使用資料的方法
-## 課前測驗
+想像《星艦迷航記》裡的星際企業號電腦——當皮卡爾艦長查詢船隻狀態時,資訊即時顯示,整個介面不會停頓或重新載入。我們要打造的,正是這種動態資料擷取的無縫資訊流。
-[課前測驗](https://ff-quizzes.netlify.app/web/quiz/45)
+目前你的銀行應用程式就像一份印刷報紙——資訊豐富但靜態。我們將其轉變成類似 NASA 任務控制中心,資料持續流動並即時更新,且不會打斷使用者的工作流程。
-### 簡介
+你將學習如何非同步與伺服器溝通,處理在不同時間到達的資料,並將原始資訊轉換為對用戶有意義的內容。這正是從示範軟體進入生產級軟體的關鍵差異。
-在每個網絡應用程式的核心,都是*數據*。數據可以有多種形式,但其主要目的是向用戶顯示信息。隨著網絡應用程式變得越來越互動和複雜,用戶如何訪問和與信息互動已成為網絡開發中的關鍵部分。
+## ⚡ 下一五分鐘你能做到什麼
-在本課中,我們將學習如何從伺服器異步獲取數據,並使用這些數據在不重新加載 HTML 的情況下,在網頁上顯示信息。
+**忙碌開發者的快速啟動路徑**
+
+```mermaid
+flowchart LR
+ A[⚡ 5 分鐘] --> B[設置 API 伺服器]
+ B --> C[用 curl 測試獲取]
+ C --> D[建立登入功能]
+ D --> E[查看實際資料]
+```
+- **第1-2分鐘**:啟動你的 API 伺服器(`cd api && npm start`)並測試連線
+- **第3分鐘**:使用 fetch 建立基本的 `getAccount()` 函數
+- **第4分鐘**:使用 `action="javascript:login()"` 連接登入表單
+- **第5分鐘**:測試登入,觀察帳戶資料在控制台顯示
+
+**快速測試指令**:
+```bash
+# 驗證 API 是否正在運行
+curl http://localhost:5000/api
-### 先決條件
+# 測試帳戶資料擷取
+curl http://localhost:5000/api/accounts/test
+```
-在學習本課之前,你需要完成網絡應用程式的[登錄和註冊表單](../2-forms/README.md)部分。此外,你還需要安裝 [Node.js](https://nodejs.org) 並[本地運行伺服器 API](../api/README.md),以便獲取帳戶數據。
+**重要原因**:五分鐘內你會見識到非同步資料擷取的魔力,這是現代所有網頁應用程式的核心。它是讓應用程式感覺迅速且生動的基石。
+
+## 🗺️ 你的資料驅動網頁應用程式學習之旅
+
+```mermaid
+journey
+ title 從靜態頁面到動態應用程式
+ section 理解演變過程
+ 傳統頁面重新載入: 3: You
+ 發現 AJAX/SPA 好處: 5: You
+ 精通 Fetch API 模式: 7: You
+ section 建立認證系統
+ 建立登入功能: 4: You
+ 處理非同步操作: 6: You
+ 管理使用者會話: 8: You
+ section 動態用戶介面更新
+ 學習 DOM 操作: 5: You
+ 建立交易顯示: 7: You
+ 製作回應式儀表板: 9: You
+ section 專業模式
+ 基於模板的渲染: 6: You
+ 錯誤處理策略: 7: You
+ 效能優化: 8: You
+```
+**旅程終點**:課程結束後,你將理解現代網頁應用如何動態擷取、處理並顯示資料,打造專業級軟體所期望的順暢用戶體驗。
-你可以通過在終端執行以下命令來測試伺服器是否正常運行:
+## 課前測驗
-```sh
+[課前測驗](https://ff-quizzes.netlify.app/web/quiz/45)
+
+### 先備條件
+
+在深入資料擷取前,請確保具備以下元件:
+
+- **上一課**:完成[登入與註冊表單](../2-forms/README.md)——我們將在此基礎上繼續擴充
+- **本地伺服器**:安裝 [Node.js](https://nodejs.org) 並[啟動 API 伺服器](../api/README.md),以提供帳戶資料
+- **API 連線**:用以下指令測試伺服器連線:
+
+```bash
curl http://localhost:5000/api
-# -> should return "Bank API v1.0.0" as a result
+# 預期回應: "Bank API v1.0.0"
+```
+
+這個快速測試能確保各元件正常通訊:
+- 確認 Node.js 在系統中正確運作
+- 確認 API 伺服器活躍並有回應
+- 驗證你的應用程式能連線到伺服器(就像任務前確保無線電聯繫)
+
+## 🧠 資料管理生態系統概覽
+
+```mermaid
+mindmap
+ root((數據管理))
+ Authentication Flow
+ Login Process
+ Form Validation
+ Credential Verification
+ Session Management
+ User State
+ Global Account Object
+ Navigation Guards
+ Error Handling
+ API Communication
+ Fetch Patterns
+ GET Requests
+ POST Requests
+ Error Responses
+ Data Formats
+ JSON Processing
+ URL Encoding
+ Response Parsing
+ Dynamic UI Updates
+ DOM Manipulation
+ Safe Text Updates
+ Element Creation
+ Template Cloning
+ User Experience
+ Real-time Updates
+ Error Messages
+ Loading States
+ Security Considerations
+ XSS Prevention
+ textContent Usage
+ Input Sanitization
+ Safe HTML Creation
+ CORS Handling
+ Cross-Origin Requests
+ Header Configuration
+ Development Setup
```
+**核心原則**:現代網頁應用是資料協調系統——它協調使用者介面、伺服器 API 與瀏覽器安全模型,創造順暢且回應迅速的體驗。
---
-## AJAX 和數據獲取
+## 了解現代網頁應用的資料擷取
-傳統的網站在用戶選擇鏈接或使用表單提交數據時,會通過重新加載整個 HTML 頁面來更新顯示的內容。每次需要加載新數據時,網絡伺服器都會返回一個全新的 HTML 頁面,瀏覽器需要處理這些頁面,這會中斷當前的用戶操作並限制重新加載期間的互動。這種工作流程也被稱為*多頁應用程式*(Multi-Page Application,MPA)。
+網頁應用處理資料的方式在過去二十年大幅演進。了解這個演變有助於你體會為什麼 AJAX 與 Fetch API 如此強大,並成為網頁開發必備工具。
-
+讓我們來探索傳統網站與現代動態、反應式應用的不同。
-隨著網絡應用程式變得更加複雜和互動性更強,一種名為 [AJAX(Asynchronous JavaScript and XML)](https://en.wikipedia.org/wiki/Ajax_(programming)) 的新技術應運而生。這種技術允許網絡應用程式使用 JavaScript 從伺服器異步發送和檢索數據,而無需重新加載 HTML 頁面,從而實現更快的更新和更流暢的用戶互動。當從伺服器接收到新數據時,可以使用 [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API 通過 JavaScript 更新當前的 HTML 頁面。隨著時間的推移,這種方法演變成現在所謂的[*單頁應用程式*(Single-Page Application,SPA)](https://en.wikipedia.org/wiki/Single-page_application)。
+### 傳統多頁面應用 (Multi-Page Applications, MPA)
-
+早期網頁時代,每次點擊就像換電視台頻道——畫面會變空白,然後慢慢載入新內容。這是早期網頁應用的現實:每次操作都要重建整個頁面。
-在 AJAX 剛推出時,唯一可用的異步獲取數據的 API 是 [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest)。但現代瀏覽器現在還實現了更方便且功能更強大的 [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API),它使用 Promise,並且更適合處理 JSON 數據。
+```mermaid
+sequenceDiagram
+ participant User
+ participant Browser
+ participant Server
+
+ User->>Browser: 點擊連結或提交表單
+ Browser->>Server: 請求新的 HTML 頁面
+ Note over Browser: 頁面變空白
+ Server->>Browser: 返回完整的 HTML 頁面
+ Browser->>User: 顯示新頁面(閃爍/重載)
+```
+
+
+**這方法令人覺得笨拙的原因:**
+- 每次點擊都重建整個頁面
+- 使用者在操作過程中會被刺眼的頁面閃爍打斷
+- 網路頻寬無謂地重複下載相同標頭與頁腳
+- 應用程式感覺像是在翻閱資料櫃,而非使用軟體
+
+### 現代單頁應用 (Single-Page Applications, SPA)
+
+AJAX(非同步 JavaScript 與 XML)完全改變了這個模式。就像國際太空站的模組化設計,太空人可以更換單一組件而不用重建整個結構,AJAX 允許我們只更新頁面特定部分,而不重新載入全部。雖然名字包含 XML,但現在我們多用 JSON,核心概念是不變的:只更新需要更改的部分。
+
+```mermaid
+sequenceDiagram
+ participant User
+ participant Browser
+ participant JavaScript
+ participant Server
+
+ User->>Browser: 與頁面互動
+ Browser->>JavaScript: 觸發事件處理程序
+ JavaScript->>Server: 只獲取所需數據
+ Server->>JavaScript: 返回 JSON 數據
+ JavaScript->>Browser: 更新指定的頁面元素
+ Browser->>User: 顯示更新內容(無需重新載入)
+```
+
+
+**SPA 感覺更好的原因:**
+- 只更新實際改變的部分(很聰明吧?)
+- 不會有突兀的中斷,使用者流程順暢
+- 傳輸資料量降低,載入更快
+- 互動回應迅速,彷彿手機應用程式一般
+
+### 演進至現代 Fetch API
+
+現代瀏覽器提供了 [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API),取代舊有的 [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest)。像用電報到電子郵件的差異,Fetch API 使用 promises提供更乾淨的非同步程式碼,且天然支援 JSON。
+
+| 功能 | XMLHttpRequest | Fetch API |
+|---------|----------------|----------|
+| **語法** | 複雜的回呼函式 | 簡潔的 promise 用法 |
+| **JSON 處理** | 需手動解析 | 內建 `.json()` 方法 |
+| **錯誤處理** | 錯誤訊息有限 | 詳盡的錯誤資訊 |
+| **現代支援** | 舊版相容性 | ES6+ promises 與 async/await |
+
+> 💡 **瀏覽器相容性**:好消息是 Fetch API 支援所有現代瀏覽器!若想了解詳細版本支援,[caniuse.com](https://caniuse.com/fetch) 有完整資料。
+>
+**總結:**
+- 在 Chrome、Firefox、Safari 及 Edge 運作良好(基本涵蓋所有用戶)
+- 只有 Internet Explorer 需要額外處理(坦白說,該淘汰 IE 了)
+- 完美支持我們稍後會用的 async/await 非同步語法模式
-> 雖然所有現代瀏覽器都支持 `Fetch API`,但如果你希望你的網絡應用程式能在舊版或老舊瀏覽器上運行,最好先檢查 [caniuse.com 上的兼容性表](https://caniuse.com/fetch)。
+### 實作使用者登入及資料擷取
-### 任務
+現在來實作登入系統,將你的銀行應用從靜態顯示轉為功能完整的應用。就像軍事安全設施使用的驗證協定,我們會檢查使用者資格,然後提供專屬資料。
-在[上一課](../2-forms/README.md)中,我們實現了註冊表單來創建帳戶。現在,我們將添加代碼來使用現有帳戶登錄並獲取其數據。打開 `app.js` 文件,並添加一個新的 `login` 函數:
+我們會逐步建立,從基本身份驗證開始,接著加入資料擷取功能。
-```js
+#### 步驟1:建立登入函數基礎
+
+開啟你的 `app.js`,新增 `login` 函數,處理使用者驗證流程:
+
+```javascript
async function login() {
- const loginForm = document.getElementById('loginForm')
+ const loginForm = document.getElementById('loginForm');
const user = loginForm.user.value;
}
```
-我們首先使用 `getElementById()` 獲取表單元素,然後通過 `loginForm.user.value` 獲取輸入框中的用戶名。每個表單控件都可以通過其名稱(在 HTML 中使用 `name` 屬性設置)作為表單的屬性來訪問。
+**解析說明:**
+- `async` 關鍵字表示這函式可能需要等待非同步操作結束
+- 我們從頁面抓取登入表單(簡單,直接用 ID 找)
+- 擷取使用者輸入的帳號名稱
+- 小技巧:可以用表單控制元件的 `name` 屬性直接存取輸入欄位,不用頻繁用 getElementById!
+
+> 💡 **表單存取模式**:每個表單控制元件都能用 HTML 中 `name` 屬性作為表單物件的屬性取得,讓讀取表單資料簡潔易懂。
+
+#### 步驟2:建立帳戶資料擷取函數
-與我們為註冊所做的類似,我們將創建另一個函數來執行伺服器請求,但這次是用於檢索帳戶數據:
+接著我們建立專門的函數從伺服器取回帳戶資料。這和你的註冊函數類似,但重點放在取得資料:
-```js
+```javascript
async function getAccount(user) {
try {
const response = await fetch('//localhost:5000/api/accounts/' + encodeURIComponent(user));
@@ -72,15 +248,58 @@ async function getAccount(user) {
}
```
-我們使用 `fetch` API 從伺服器異步請求數據,但這次我們不需要額外的參數,只需調用的 URL,因為我們只是查詢數據。默認情況下,`fetch` 創建一個 [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) HTTP 請求,這正是我們需要的。
-
-✅ `encodeURIComponent()` 是一個用於對 URL 中的特殊字符進行編碼的函數。如果我們不調用此函數而直接在 URL 中使用 `user` 值,可能會出現什麼問題?
+**這段程式碼做了什麼:**
+- **使用** 現代 `fetch` API 進行非同步資料請求
+- **組裝** GET 請求 URL 並帶入帳號參數
+- **套用** `encodeURIComponent()` 確保網址安全處理特殊字元
+- **轉換** 回應為 JSON 格式方便操作
+- **妥善** 處理錯誤,回傳錯誤物件而非崩潰
+
+> ⚠️ **安全提示**:`encodeURIComponent()` 函數會處理網址中特殊字元。像海軍通訊的編碼系統,確保訊息準確無誤地傳達,避免 "#" 或 "&" 等字元被誤解。
+>
+**重要性:**
+- 避免特殊字元破壞 URL 格式
+- 防止網址遭竄改攻擊
+- 確保伺服器接收正確資料
+- 遵循安全編碼最佳實踐
+
+#### 了解 HTTP GET 請求
+
+這裡有個可能令你驚訝的事:當你使用 `fetch` 而沒有傳入特別設定,預設會是 [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) 請求。非常適合我們的需求——向伺服器請求看某使用者帳戶資料。
+
+想像 GET 請求像是禮貌地向圖書館借書——請求檢視已存在資料。而 POST 請求(註冊時用的)則像送新書加入館藏。
+
+| GET 請求 | POST 請求 |
+|-------------|-------------|
+| **目的** | 取得現有資料 | 傳送新資料到伺服器 |
+| **參數** | 在網址路徑/查詢字串 | 在請求主體中 |
+| **快取** | 可被瀏覽器快取 | 通常不快取 |
+| **安全性** | 顯示於網址/紀錄中 | 隱藏在請求主體 |
+
+```mermaid
+sequenceDiagram
+ participant B as 瀏覽器
+ participant S as 伺服器
+
+ Note over B,S: GET 請求(資料檢索)
+ B->>S: GET /api/accounts/test
+ S-->>B: 200 成功 + 帳戶資料
+
+ Note over B,S: POST 請求(資料提交)
+ B->>S: POST /api/accounts + 新帳戶資料
+ S-->>B: 201 已建立 + 確認訊息
+
+ Note over B,S: 錯誤處理
+ B->>S: GET /api/accounts/nonexistent
+ S-->>B: 404 未找到 + 錯誤訊息
+```
+#### 步驟3:彙整整合
-現在我們來更新 `login` 函數以使用 `getAccount`:
+現在來一段令人滿意的串連程式,將帳戶擷取函數接入登入流程:
-```js
+```javascript
async function login() {
- const loginForm = document.getElementById('loginForm')
+ const loginForm = document.getElementById('loginForm');
const user = loginForm.user.value;
const data = await getAccount(user);
@@ -93,94 +312,272 @@ async function login() {
}
```
-首先,由於 `getAccount` 是一個異步函數,我們需要使用 `await` 關鍵字來等待伺服器結果。與任何伺服器請求一樣,我們還需要處理錯誤情況。目前,我們只添加一條日誌消息來顯示錯誤,稍後再處理。
+這個函數依序執行:
+- 從表單取得使用者帳號
+- 向伺服器索取該帳號的資料
+- 處理過程中可能出現的錯誤
+- 成功時存儲帳戶資料並跳轉至儀表板
+
+> 🎯 **Async/Await 範式**:因為 `getAccount` 是非同步函式,我們用 `await` 暫停程式執行,直到伺服器有回應,避免後續使用未定義資料。
-然後,我們需要將數據存儲在某個地方,以便稍後用於顯示儀表板信息。由於 `account` 變量尚不存在,我們將在文件頂部創建一個全局變量:
+#### 步驟4:為資料打造存放處
-```js
+應用程式需要記憶讀入的帳戶資訊,像短期記憶一樣,保持目前登入用戶資料隨時可用。在 `app.js` 檔案上方加這行:
+
+```javascript
+// 儲存當前用戶的帳戶資料
let account = null;
```
-在用戶數據保存到變量後,我們可以使用已經存在的 `navigate()` 函數從*登錄*頁面導航到*儀表板*。
+**為什麼需要它:**
+- 讓整個應用程式能隨時存取帳戶資料
+- 初始設為 `null` 表示「尚未有人登入」
+- 當有人成功登入或註冊時更新其內容
+- 作為唯一資料來源,避免登入狀態混淆
+
+#### 步驟5:連接表單與功能
-最後,我們需要在提交登錄表單時調用 `login` 函數,通過修改 HTML:
+接著將你的登入新功能連結到 HTML 表單,修改表單標籤如下:
```html
```
-通過註冊新帳戶並嘗試使用相同帳戶登錄,測試一切是否正常運行。
+**這個小改動帶來的效果:**
+- 阻止表單預設的「整頁重新載入」動作
+- 改由自訂的 JavaScript 函數處理
+- 保持單頁應用的平滑體驗
+- 完全控制使用者按下「登入」的行為
-在進入下一部分之前,我們還可以通過在 `register` 函數底部添加以下內容來完成該函數:
+#### 步驟6:增強註冊功能
-```js
+為保持一致性,更新你的 `register` 函式,也讓它存取帳戶資料並跳轉到儀表板:
+
+```javascript
+// 將這些行添加到您的註冊功能的末尾
account = result;
navigate('/dashboard');
```
-✅ 你知道嗎?默認情況下,你只能從與你正在查看的網頁相同的*域名和端口*調用伺服器 API。這是瀏覽器強制執行的一種安全機制。但等等,我們的網絡應用程式運行在 `localhost:3000`,而伺服器 API 運行在 `localhost:5000`,為什麼它能正常工作?通過使用一種名為 [跨域資源共享(CORS)](https://developer.mozilla.org/docs/Web/HTTP/CORS) 的技術,如果伺服器在響應中添加了特殊的標頭,允許特定域名的例外,就可以執行跨域 HTTP 請求。
+**這項優化帶來:**
+- 註冊完成無縫轉到儀表板
+- 登入與註冊流程體驗一致
+- 成功註冊後立即取得帳戶資料
+
+#### 測試你的實作
+
+```mermaid
+flowchart TD
+ A[用戶輸入憑證] --> B[呼叫登入功能]
+ B --> C[從伺服器取得帳戶資料]
+ C --> D{資料是否成功接收?}
+ D -->|是| E[全域儲存帳戶資料]
+ D -->|否| F[顯示錯誤訊息]
+ E --> G[導向儀表板]
+ F --> H[用戶停留在登入頁面]
+```
+**現在試運行:**
+1. 建立新帳戶,確認流程正常
+2. 使用同樣的憑證嘗試登入
+3. 如有異常,打開瀏覽器控制台(F12)檢查
+4. 確認成功登入後進入儀表板頁面
+
+遇到問題別慌,多數情況下是簡單錯誤或忘了啟動 API 伺服器。
+
+#### 跨來源通訊的小秘密
+
+你可能會想:「我的網頁應用跟 API 伺服器分別跑在不同埠口,怎能互通?」好問題!這是所有網頁開發者都會遇到的話題。
+
+> 🔒 **跨來源安全政策**:瀏覽器強制執行「同源政策」以防止未授權跨域通訊,就像五角大廈的檢查站,核對通訊是否授權後才允許資料傳送。
+>
+**本示範設定:**
+- 你的網頁應用運行於 `localhost:3000`(開發伺服器)
+- API 伺服器運行於 `localhost:5000`(後端伺服器)
+- API 伺服器包含 [CORS 標頭](https://developer.mozilla.org/docs/Web/HTTP/CORS) 明確授權來自網頁應用的通訊
-> 通過學習這個[課程](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon)了解更多關於 API 的知識。
+這種架構與實務開發情境相符,前後端通常分別部署於不同伺服器。
-## 更新 HTML 以顯示數據
+> 📚 **擴充學習**:深入瞭解 API 與資料擷取,請參考 Microsoft Learn 的完整 [API 課程](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon)。
-現在我們已經獲取了用戶數據,我們需要更新現有的 HTML 來顯示這些數據。我們已經知道如何使用例如 `document.getElementById()` 從 DOM 中檢索元素。在獲取基礎元素後,以下是一些可以用來修改或添加子元素的 API:
+## 將資料動態呈現在 HTML 中
-- 使用 [`textContent`](https://developer.mozilla.org/docs/Web/API/Node/textContent) 屬性可以更改元素的文本內容。請注意,更改此值會刪除該元素的所有子元素(如果有的話),並將其替換為提供的文本。因此,通過將空字符串 `''` 賦值給它,也是一種高效的方法來刪除給定元素的所有子元素。
+現在我們透過 DOM 操控將擷取的資料呈現給使用者。就像洗相片暗房的過程,我們將看不見的資料轉成使用者可見且可互動的內容。
+DOM 操作是將靜態網頁轉換成動態應用程式的技術,能根據用戶互動和伺服器回應更新內容。
-- 使用 [`document.createElement()`](https://developer.mozilla.org/docs/Web/API/Document/createElement) 和 [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append) 方法,你可以創建並附加一個或多個新的子元素。
+### 選擇合適的工具完成工作
-✅ 使用元素的 [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) 屬性也可以更改其 HTML 內容,但應避免使用此方法,因為它容易受到[跨站腳本(XSS)](https://developer.mozilla.org/docs/Glossary/Cross-site_scripting) 攻擊。
+在使用 JavaScript 更新 HTML 時,你有幾個選擇。把它們想成工具箱中的不同工具—每一個都適合特定工作:
-### 任務
+| 方法 | 適合用途 | 何時使用 | 安全程度 |
+|--------|---------------------|----------------|--------------|
+| `textContent` | 安全顯示用戶資料 | 任何顯示文字時 | ✅ 非常穩固 |
+| `createElement()` + `append()` | 建立複雜排版 | 新增區域/清單時 | ✅ 可靠無虞 |
+| `innerHTML` | 設定 HTML 內容 | ⚠️ 建議盡量避免 | ❌ 有風險 |
-在進入*儀表板*頁面之前,我們應該先在*登錄*頁面上完成一件事。目前,如果你嘗試使用不存在的用戶名登錄,控制台會顯示一條消息,但對於普通用戶來說,什麼都沒有改變,也不知道發生了什麼。
+#### 安全顯示文字:textContent
-讓我們在登錄表單中添加一個占位元素,以便在需要時顯示錯誤消息。一個不錯的位置是在登錄 `