# 使用 Next.js + FastAPI 建構表單資料轉換器(Mapper)模組 在實務專案中,前端表單往往由多層巢狀的資料組成,例如使用者輸入的一系列目標設定、報告項目、子任務等。但後端通常需要儲存成平坦化的資料表(例如:一張批次表、一張細項表、一張子細項表)。 為了解決前端與後端資料格式不一致的問題,我們可以設計一個 **Mapper 模組**,作為兩端資料結構之間的轉譯橋梁。 --- ## 🧰 系統架構概覽 * 前端:使用 **Next.js + React Hook Form** 建構表單 * 後端:使用 **FastAPI** 作為 RESTful API 框架 * 資料庫:PostgreSQL,使用多張關聯表設計 --- ## 📌 範例情境:多層表單資料送出 假設你要送出一份多層結構的「使用者目標設定表單」: ```json { "category_id": 3, "year": 2024, "owner": "Alice", "items": [ { "name": "任務 A", "value": 100, "sub_items": [ { "label": "子任務 A1", "score": 30 }, { "label": "子任務 A2", "score": 70 } ] } ] } ``` 後端需要將資料拆解後分別寫入: * `goal_batches` 表(紀錄批次) * `goal_items` 表(每個任務) * `goal_sub_items` 表(任務下的子任務) --- ## 🔧 Mapper 設計 撰寫一個通用的 `map_goal_payload()` 函式,協助拆解 JSON 結構: ```python def map_goal_payload(payload: dict) -> dict: batch_data = { "category_id": payload["category_id"], "year": payload["year"], "owner": payload["owner"] } items_data = [] for item in payload["items"]: item_data = { "name": item["name"], "value": item["value"], "sub_items": item.get("sub_items", []) } items_data.append(item_data) return { "batch": batch_data, "items": items_data } ``` --- ## 💡 實際應用 in FastAPI ```python @router.post("/goals/submit") def submit_goals(payload: dict, db: Session = Depends(get_db)): mapped = map_goal_payload(payload) batch = GoalBatch(**mapped["batch"]) db.add(batch) db.flush() for item in mapped["items"]: goal_item = GoalItem(batch_id=batch.id, name=item["name"], value=item["value"]) db.add(goal_item) db.flush() for sub in item["sub_items"]: sub_item = GoalSubItem(item_id=goal_item.id, **sub) db.add(sub_item) db.commit() return {"message": "成功建立目標紀錄"} ``` --- ## 🧪 搭配 Pydantic 型別驗證 定義清楚的 Schema 可提升開發效率與資料安全性: ```python class SubItemSchema(BaseModel): label: str score: int class GoalItemSchema(BaseModel): name: str value: int sub_items: List[SubItemSchema] class GoalBatchSchema(BaseModel): category_id: int year: int owner: str items: List[GoalItemSchema] ``` --- ## 🔍 結語:將前端巢狀資料結構轉換為後端關聯資料的利器 透過 Mapper 設計: * ✅ 將複雜表單結構轉成簡潔平坦格式 * ✅ 降低後端邏輯耦合,方便重用與測試 * ✅ 對應前端 JSON 結構變化,只需更新 mapping 規則即可 這種設計特別適合複雜業務系統、ERP、CRM、內部管理後台等場景。