Major Features: - ✅ Multi-tenant architecture (tenant isolation) - ✅ Employee CRUD with lifecycle management (onboarding/offboarding) - ✅ Department tree structure with email domain management - ✅ Company info management (single-record editing) - ✅ System functions CRUD (permission management) - ✅ Email account management (multi-account per employee) - ✅ Keycloak SSO integration (auth.lab.taipei) - ✅ Redis session storage (10.1.0.254:6379) - Solves Cookie 4KB limitation - Cross-system session sharing - Sliding expiration (8 hours) - Automatic token refresh Technical Stack: Backend: - FastAPI + SQLAlchemy - PostgreSQL 16 (10.1.0.20:5433) - Keycloak Admin API integration - Docker Mailserver integration (SSH) - Alembic migrations Frontend: - Next.js 14 (App Router) - NextAuth 4 with Keycloak Provider - Redis session storage (ioredis) - Tailwind CSS Infrastructure: - Redis 7 (10.1.0.254:6379) - Session + Cache - Keycloak 26.1.0 (auth.lab.taipei) - Docker Mailserver (10.1.0.254) Architecture Highlights: - Session管理由 Keycloak + Redis 統一控制 - 支援多系統 (HR/WebMail/Calendar/Drive/Office) 共享 session - Token 自動刷新,異質服務整合 - 未來可無縫遷移到雲端 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
12 KiB
HR Portal Phase 1.2 完成報告
階段: Phase 1.2 - 後端專案架構 (FastAPI 專案初始化) 完成日期: 2026-02-15 狀態: ✅ 完成
📋 執行摘要
成功完成 HR Portal 後端架構的建置,新增了郵件帳號管理和系統權限管理兩大核心功能模組。所有 API 端點都遵循 RESTful 設計原則,支援多租戶架構,並整合了審計日誌功能。
✅ 完成項目
1. Pydantic Schemas 建立 (資料驗證層)
郵件帳號 Schemas
檔案: app/schemas/email_account.py
| Schema 類別 | 用途 | 關鍵欄位 |
|---|---|---|
EmailAccountBase |
基礎資料 | email_address, quota_mb, forward_to, auto_reply, is_active |
EmailAccountCreate |
創建請求 | 繼承 Base + employee_id |
EmailAccountUpdate |
更新請求 | 所有欄位可選,支援清空轉寄/自動回覆 |
EmailAccountInDB |
資料庫模型 | 繼承 Base + id, tenant_id, employee_id, timestamps |
EmailAccountResponse |
API 回應 | 繼承 InDB + employee_name, employee_number |
EmailAccountListItem |
列表項目 | 簡化版,用於列表顯示 |
EmailAccountQuotaUpdate |
配額更新 | 單一 quota_mb 欄位 |
特色功能:
- Email 格式驗證 (EmailStr)
- 配額範圍驗證 (1024-102400 MB / 1GB-100GB)
- 支援清空轉寄地址和自動回覆 (空字串轉 None)
系統權限 Schemas
| Schema 類別 | 用途 | 關鍵欄位 |
|---|---|---|
PermissionBase |
基礎資料 | system_name, access_level |
PermissionCreate |
創建請求 | 繼承 Base + employee_id, granted_by |
PermissionUpdate |
更新請求 | access_level, granted_by |
PermissionInDB |
資料庫模型 | 繼承 Base + id, tenant_id, employee_id, granted_at |
PermissionResponse |
API 回應 | 繼承 InDB + employee_name, employee_number, granted_by_name |
PermissionListItem |
列表項目 | 簡化版,用於列表顯示 |
PermissionBatchCreate |
批量創建 | employee_id + permissions 陣列 |
PermissionFilter |
篩選條件 | employee_id, system_name, access_level |
常數定義:
VALID_SYSTEMS = ["gitea", "portainer", "traefik", "keycloak"]
VALID_ACCESS_LEVELS = ["admin", "user", "readonly"]
驗證功能:
- 系統名稱驗證 (必須在 VALID_SYSTEMS 中)
- 存取層級驗證 (必須在 VALID_ACCESS_LEVELS 中)
- 自動轉小寫
2. RESTful API Endpoints 實作
郵件帳號管理 API
檔案: app/api/v1/email_accounts.py
前綴: /api/v1/email-accounts
| 端點 | 方法 | 功能 | 查詢參數 |
|---|---|---|---|
/ |
GET | 獲取郵件帳號列表 | employee_id, is_active, search, page, page_size |
/{id} |
GET | 獲取郵件帳號詳情 | - |
/ |
POST | 創建郵件帳號 | - |
/{id} |
PUT | 更新郵件帳號 | - |
/{id}/quota |
PATCH | 更新郵件配額 | - |
/{id} |
DELETE | 停用郵件帳號 | - |
/employees/{employee_id}/email-accounts |
GET | 獲取員工的所有郵件帳號 | - |
業務邏輯:
- 創建時檢查郵件地址唯一性
- 創建時檢查員工是否存在
- 刪除採用軟刪除 (設為 is_active=False)
- 支援郵件地址搜尋 (ILIKE)
- 自動記錄審計日誌
系統權限管理 API
檔案: app/api/v1/permissions.py
前綴: /api/v1/permissions
| 端點 | 方法 | 功能 | 查詢參數 |
|---|---|---|---|
/ |
GET | 獲取權限列表 | employee_id, system_name, access_level, page, page_size |
/{id} |
GET | 獲取權限詳情 | - |
/ |
POST | 創建權限 | - |
/{id} |
PUT | 更新權限 | - |
/{id} |
DELETE | 刪除權限 | - |
/employees/{employee_id}/permissions |
GET | 獲取員工的所有系統權限 | - |
/batch |
POST | 批量創建權限 | - |
/systems |
GET | 獲取可授權的系統列表 | - |
業務邏輯:
- 創建時檢查員工和授予人是否存在
- 創建時檢查 (employee_id, system_name) 唯一性
- 批量創建時跳過已存在的權限
- 刪除採用硬刪除
- 自動記錄審計日誌
- 提供系統列表和權限層級說明
3. 路由註冊
# 郵件帳號管理
api_router.include_router(
email_accounts.router,
prefix="/email-accounts",
tags=["Email Accounts"]
)
# 系統權限管理
api_router.include_router(
permissions.router,
prefix="/permissions",
tags=["Permissions"]
)
4. Schema 模組更新
新增以下匯出:
- EmailAccount 相關 Schemas (7 個類別)
- Permission 相關 Schemas (8 個類別 + 2 個常數)
🏗️ 架構特色
多租戶支援
- 所有 API 都透過
get_current_tenant_id()進行租戶隔離 - 目前暫時返回固定值 (tenant_id=1)
- 未來將從 JWT token 中提取租戶 ID
審計日誌整合
所有 CUD 操作都自動記錄審計日誌:
audit_service.log_action(
request=request,
db=db,
action="create_email_account",
resource_type="email_account",
resource_id=account.id,
details={...}
)
資料驗證
- Pydantic 自動驗證請求資料
- 自訂驗證器 (field_validator)
- 資料庫約束檢查 (唯一性、外鍵)
關聯資料載入
- 使用 SQLAlchemy
joinedload優化查詢 - 避免 N+1 查詢問題
- 回應中包含關聯員工資訊
錯誤處理
- 404: 資源不存在
- 400: 驗證失敗或違反約束
- 詳細的錯誤訊息 (英文)
📊 統計數據
新增程式碼
- 新增檔案: 3 個
app/schemas/email_account.py(~130 行)app/schemas/permission.py(~160 行)app/api/v1/permissions.py(~490 行)
- 重寫檔案: 1 個
app/api/v1/email_accounts.py(~426 行)
- 更新檔案: 2 個
app/schemas/__init__.py(+24 行)app/api/v1/router.py(+8 行)
API 端點統計
- 郵件帳號管理: 7 個端點
- 系統權限管理: 8 個端點
- 總計新增: 15 個端點
資料模型
- Pydantic Schemas: 15 個類別
- 常數定義: 2 個
- 支援的系統: 4 個 (Gitea, Portainer, Traefik, Keycloak)
- 權限層級: 3 個 (admin, user, readonly)
🔧 技術棧
核心框架
- FastAPI 0.109.0 - Web 框架
- Pydantic 2.5.3 - 資料驗證
- SQLAlchemy 2.0.25 - ORM
資料驗證
- email-validator 2.1.0 - Email 格式驗證
- dnspython - Email 驗證依賴
資料庫
- PostgreSQL 16
- psycopg2-binary 2.9.9 - PostgreSQL 驅動
📝 文件產出
1. API 端點清單
檔案: API_ENDPOINTS.md
完整的 API 端點參考文件,包含:
- 所有端點的 URL 和 HTTP 方法
- 查詢參數說明
- 回應格式範例
- HTTP 狀態碼說明
2. 測試腳本
用於驗證模組導入的測試腳本:
- 測試 Schemas 導入
- 測試 Models 導入
- 測試 API Routers 導入
- 測試主應用導入
✨ 關鍵功能亮點
1. 郵件配額管理
class EmailAccountQuotaUpdate(BaseSchema):
quota_mb: int = Field(..., ge=1024, le=102400)
- 配額範圍: 1GB - 100GB
- 獨立的配額更新端點 (PATCH)
- 自動記錄配額變更歷史
2. 批量權限授予
@router.post("/batch")
def create_permissions_batch(
batch_data: PermissionBatchCreate, ...
):
- 一次為員工授予多個系統權限
- 自動跳過已存在的權限
- 減少 API 呼叫次數
3. 軟刪除機制
郵件帳號採用軟刪除 (is_active=False),避免資料遺失:
account.is_active = False
db.commit()
4. 驗證器鏈
@field_validator('system_name')
@classmethod
def validate_system_name(cls, v):
if v.lower() not in VALID_SYSTEMS:
raise ValueError(...)
return v.lower()
🧪 測試建議
單元測試
- Pydantic Schema 驗證測試
- Field validator 測試
- 資料轉換測試
整合測試
- API 端點測試 (CRUD)
- 多租戶隔離測試
- 審計日誌記錄測試
- 錯誤處理測試
性能測試
- 分頁查詢效能
- joinedload 優化驗證
- 批量操作效能
🔄 與前端整合
API 客戶端設定
前端需要配置以下 API 端點:
// Email Accounts API
const emailAccountsAPI = {
list: '/api/v1/email-accounts',
get: (id) => `/api/v1/email-accounts/${id}`,
create: '/api/v1/email-accounts',
update: (id) => `/api/v1/email-accounts/${id}`,
updateQuota: (id) => `/api/v1/email-accounts/${id}/quota`,
delete: (id) => `/api/v1/email-accounts/${id}`,
getByEmployee: (employeeId) =>
`/api/v1/email-accounts/employees/${employeeId}/email-accounts`,
}
// Permissions API
const permissionsAPI = {
list: '/api/v1/permissions',
get: (id) => `/api/v1/permissions/${id}`,
create: '/api/v1/permissions',
update: (id) => `/api/v1/permissions/${id}`,
delete: (id) => `/api/v1/permissions/${id}`,
getByEmployee: (employeeId) =>
`/api/v1/permissions/employees/${employeeId}/permissions`,
batchCreate: '/api/v1/permissions/batch',
getSystems: '/api/v1/permissions/systems',
}
📚 下一步 (Phase 1.3)
前端專案架構建立
- React + TypeScript 專案初始化
- Tailwind CSS 設定
- 路由配置 (React Router)
- 狀態管理 (Zustand / Redux Toolkit)
- API 客戶端設定 (Axios / React Query)
- 表單驗證 (React Hook Form + Zod)
- UI 元件庫整合
元件開發優先順序
- 員工列表頁面
- 員工詳情頁面
- 郵件帳號管理元件
- 系統權限管理元件
- 表單元件 (員工、郵件、權限)
💡 經驗總結
做得好的地方
✅ 一致的程式碼風格: 遵循現有專案規範 ✅ 完整的型別提示: 所有函數都有完整的 type hints ✅ 詳細的文件註解: 每個端點都有清楚的 docstring ✅ 審計日誌整合: 所有變更都有記錄 ✅ 多租戶架構: 為未來擴展做好準備
遇到的挑戰
⚠️ 循環導入問題: Models 之間的相互引用導致導入錯誤 ⚠️ 網路磁碟延遲: 檔案操作因網路延遲而緩慢 ⚠️ Unicode 編碼: Windows console 對 Unicode 字元支援不佳
解決方案
✅ 使用延遲初始化避免循環導入 ✅ 使用背景任務處理長時間操作 ✅ 避免在輸出中使用 Unicode 特殊字元
📋 檢查清單
- Pydantic Schemas 建立完成
- API Endpoints 實作完成
- 路由註冊完成
- 審計日誌整合
- 多租戶支援
- 資料驗證
- 錯誤處理
- 文件產出 (API_ENDPOINTS.md)
- 測試腳本建立
- 程式碼檢查 (語法)
- 單元測試 (待 Phase 2)
- 整合測試 (待 Phase 2)
- API 文件檢視 (/docs)
- 實際 API 測試 (Postman/curl)
🎯 結論
Phase 1.2 成功完成了 HR Portal 後端架構的核心功能建置。新增的郵件帳號管理和系統權限管理 API 為系統提供了完整的帳號生命週期管理能力,符合 ISO 帳號管理流程要求。
所有 API 端點都遵循 RESTful 設計原則,支援分頁、篩選、搜尋等常用功能。程式碼品質良好,具有完整的型別提示和文件註解,為後續的維護和擴展奠定了良好基礎。
準備進入 Phase 1.3: 前端專案架構建立
報告產出日期: 2026-02-15 撰寫者: Claude AI 審核者: (待填寫)