feat: HR Portal - Complete Multi-Tenant System with Redis Session Storage
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>
This commit is contained in:
495
PROJECT_STATUS.md
Normal file
495
PROJECT_STATUS.md
Normal file
@@ -0,0 +1,495 @@
|
||||
# HR Portal v2.0 專案狀態報告
|
||||
|
||||
**專案版本**: v2.0
|
||||
**開發開始**: 2026-02-10
|
||||
**最後更新**: 2026-02-11
|
||||
**專案負責人**: Porsche Chen
|
||||
|
||||
---
|
||||
|
||||
## 📊 總體進度
|
||||
|
||||
| 階段 | 完成度 | 狀態 |
|
||||
|------|--------|------|
|
||||
| **Phase 1: 基礎建設** | 100% | ✅ 已完成 |
|
||||
| Phase 2: 核心功能整合 | 0% | ⏳ 待開始 |
|
||||
| Phase 3: 資源管理整合 | 0% | ⏳ 待開始 |
|
||||
| Phase 4: 測試與優化 | 0% | ⏳ 待開始 |
|
||||
| **總體完成度** | **40%** | 🟢 進行中 |
|
||||
|
||||
---
|
||||
|
||||
## ✅ Phase 1: 基礎建設 (已完成 100%)
|
||||
|
||||
### 1.1 資料庫設計 ✅
|
||||
|
||||
**位置**: `3.Develop/4.HR_Portal/database/`
|
||||
|
||||
| 檔案 | 說明 | 狀態 |
|
||||
|------|------|------|
|
||||
| schema.sql | PostgreSQL Schema v2.0 | ✅ |
|
||||
| test_schema.sql | 完整測試腳本 | ✅ |
|
||||
| docker-compose.yml | PostgreSQL + pgAdmin 測試環境 | ✅ |
|
||||
| TESTING.md | 測試指南 | ✅ |
|
||||
| README.md | 資料庫說明文件 | ✅ |
|
||||
|
||||
**核心表格** (6 個):
|
||||
- `employees` - 員工基本資料
|
||||
- `business_units` - 事業部
|
||||
- `departments` - 部門
|
||||
- `employee_identities` - 員工身份 (多對多)
|
||||
- `network_drives` - 網路硬碟 (一對一)
|
||||
- `audit_logs` - 審計日誌
|
||||
|
||||
**初始資料**:
|
||||
- 3 個事業部 (業務發展部、智能發展部、營運管理部)
|
||||
- 9 個部門
|
||||
|
||||
### 1.2 後端 API ✅
|
||||
|
||||
**位置**: `3.Develop/4.HR_Portal/backend/`
|
||||
|
||||
#### SQLAlchemy Models (6 個)
|
||||
- `Employee` - 員工基本資料 (含狀態 Enum)
|
||||
- `BusinessUnit` - 事業部
|
||||
- `Department` - 部門
|
||||
- `EmployeeIdentity` - 員工身份
|
||||
- `NetworkDrive` - 網路硬碟
|
||||
- `AuditLog` - 審計日誌
|
||||
|
||||
#### Pydantic Schemas (8 個模組)
|
||||
- `base` - 基礎 Schema、分頁
|
||||
- `employee` - 員工 CRUD Schema
|
||||
- `business_unit` - 事業部 CRUD Schema
|
||||
- `department` - 部門 CRUD Schema
|
||||
- `employee_identity` - 身份 CRUD Schema
|
||||
- `network_drive` - 網路硬碟 CRUD Schema
|
||||
- `audit_log` - 審計日誌 Schema
|
||||
- `response` - 通用響應 Schema
|
||||
|
||||
#### API 端點 (35 個)
|
||||
| 模組 | 端點數 | 完成度 |
|
||||
|------|--------|--------|
|
||||
| 員工管理 | 7 | ✅ 100% |
|
||||
| 事業部管理 | 6 | ✅ 100% |
|
||||
| 部門管理 | 5 | ✅ 100% |
|
||||
| 身份管理 | 5 | ✅ 100% |
|
||||
| 網路硬碟管理 | 7 | ✅ 100% |
|
||||
| 審計日誌 | 5 | ✅ 100% |
|
||||
|
||||
#### 核心配置
|
||||
- `core/config.py` - Pydantic Settings 環境變數管理
|
||||
- `core/logging_config.py` - 日誌系統 (支援 JSON 格式)
|
||||
- `.env.example` - 環境變數範例
|
||||
- `requirements.txt` - 完整依賴清單
|
||||
|
||||
#### 文檔
|
||||
- `README.md` - 專案說明
|
||||
- `PROGRESS.md` - 開發進度
|
||||
- `API_COMPLETE.md` - API 完成摘要
|
||||
|
||||
---
|
||||
|
||||
## 🎯 核心功能特色
|
||||
|
||||
### 1. 員工多身份設計 ✅
|
||||
|
||||
**設計理念**:
|
||||
- 一個員工 (`employees`) 可以有多個身份 (`employee_identities`)
|
||||
- 每個身份對應一個事業部
|
||||
- 同事業部多部門 → 共用一個 SSO 帳號
|
||||
- 跨事業部 → 獨立的 SSO 帳號
|
||||
|
||||
**SSO 帳號命名規則**:
|
||||
```
|
||||
格式: {username_base}@{email_domain}
|
||||
|
||||
範例:
|
||||
- porsche.chen@lab.taipei (智能發展部)
|
||||
- porsche.chen@ease.taipei (業務發展部)
|
||||
- porsche.chen@porscheworld.tw (營運管理部)
|
||||
```
|
||||
|
||||
**NAS 帳號規則**:
|
||||
- 一個員工只有一個 NAS 帳號
|
||||
- 帳號名稱 = `username_base`
|
||||
- 配額由所有身份中的最高職級決定
|
||||
|
||||
### 2. 完整的 CRUD API ✅
|
||||
|
||||
**支援功能**:
|
||||
- ✅ 分頁 (page, page_size)
|
||||
- ✅ 搜尋 (關鍵字搜尋)
|
||||
- ✅ 篩選 (狀態、事業部、部門等)
|
||||
- ✅ 軟刪除 (保留資料)
|
||||
- ✅ 自動化 (員工編號、SSO 帳號生成)
|
||||
|
||||
### 3. 資料完整性保證 ✅
|
||||
|
||||
**約束**:
|
||||
- 外鍵約束 (`ON DELETE CASCADE`)
|
||||
- 唯一約束 (防止重複資料)
|
||||
- 索引優化 (查詢性能)
|
||||
|
||||
**業務規則驗證**:
|
||||
- 同一員工在同一事業部只能有一個身份
|
||||
- 一個員工只能有一個 NAS 帳號
|
||||
- 無法刪除員工的最後一個身份
|
||||
- 無法停用有活躍員工的事業部/部門
|
||||
|
||||
### 4. 審計日誌 ✅
|
||||
|
||||
**記錄內容**:
|
||||
- 操作類型 (create/update/delete/login)
|
||||
- 資源類型 (employee/identity/department)
|
||||
- 操作者 (SSO 帳號)
|
||||
- 時間戳記
|
||||
- 詳細變更內容 (JSONB)
|
||||
- IP 位址
|
||||
|
||||
**查詢功能**:
|
||||
- 按時間範圍篩選
|
||||
- 按資源類型篩選
|
||||
- 按操作者篩選
|
||||
- 統計分析 (Top 10 用戶、操作分布)
|
||||
|
||||
---
|
||||
|
||||
## 📋 待實作功能
|
||||
|
||||
### Phase 2: 核心功能整合 (預計 1 週)
|
||||
|
||||
#### 2.1 Keycloak SSO 整合 ⏳
|
||||
- [ ] 創建 `services/keycloak_service.py`
|
||||
- [ ] JWT Token 驗證中間件
|
||||
- [ ] 自動創建 Keycloak 帳號 (創建身份時)
|
||||
- [ ] 自動停用 Keycloak 帳號 (停用身份時)
|
||||
- [ ] 獲取用戶資訊
|
||||
- [ ] 權限管理
|
||||
|
||||
**依賴項**:
|
||||
```python
|
||||
# app/api/deps.py
|
||||
def get_current_user(
|
||||
token: str = Depends(oauth2_scheme),
|
||||
db: Session = Depends(get_db)
|
||||
) -> User:
|
||||
"""獲取當前登入用戶"""
|
||||
# TODO: 實作 Keycloak Token 驗證
|
||||
pass
|
||||
|
||||
def check_permission(required_permission: str):
|
||||
"""檢查用戶權限"""
|
||||
# TODO: 實作權限檢查
|
||||
pass
|
||||
```
|
||||
|
||||
#### 2.2 審計日誌服務 ⏳
|
||||
- [ ] 創建 `services/audit_service.py`
|
||||
- [ ] 自動記錄 CRUD 操作
|
||||
- [ ] 中間件或裝飾器實作
|
||||
- [ ] 獲取客戶端 IP
|
||||
|
||||
**實作方式**:
|
||||
```python
|
||||
# 方式 1: 裝飾器
|
||||
@audit_log(action="create", resource_type="employee")
|
||||
def create_employee(...):
|
||||
pass
|
||||
|
||||
# 方式 2: 服務調用
|
||||
audit_service.log(
|
||||
action="create",
|
||||
resource_type="employee",
|
||||
resource_id=employee.id,
|
||||
performed_by=current_user.username,
|
||||
details={...}
|
||||
)
|
||||
```
|
||||
|
||||
#### 2.3 權限控制 ⏳
|
||||
- [ ] 定義角色 (Admin, HR Manager, Department Manager, Employee)
|
||||
- [ ] 實作基於角色的訪問控制 (RBAC)
|
||||
- [ ] API 端點權限裝飾器
|
||||
- [ ] 資料級權限 (只能查看/修改自己部門的資料)
|
||||
|
||||
#### 2.4 單元測試 ⏳
|
||||
- [ ] 創建 `tests/` 目錄結構
|
||||
- [ ] Models 測試
|
||||
- [ ] Schemas 測試
|
||||
- [ ] API 端點測試
|
||||
- [ ] 覆蓋率 > 80%
|
||||
|
||||
**測試框架**: pytest + pytest-asyncio
|
||||
|
||||
### Phase 3: 資源管理整合 (預計 1 週)
|
||||
|
||||
#### 3.1 郵件服務整合 ⏳
|
||||
- [ ] 創建 `services/mail_service.py`
|
||||
- [ ] Docker Mailserver API 整合
|
||||
- [ ] 創建郵件帳號
|
||||
- [ ] 設定配額
|
||||
- [ ] 刪除/停用郵件帳號
|
||||
- [ ] 查詢使用量
|
||||
|
||||
**郵件配額規則**:
|
||||
- Junior: 1000 MB
|
||||
- Mid: 2000 MB
|
||||
- Senior: 5000 MB
|
||||
- Manager: 10000 MB
|
||||
|
||||
#### 3.2 NAS 服務整合 ⏳
|
||||
- [ ] 創建 `services/nas_service.py`
|
||||
- [ ] Synology API 整合
|
||||
- [ ] 創建 NAS 帳號
|
||||
- [ ] 設定配額
|
||||
- [ ] 刪除/停用 NAS 帳號
|
||||
- [ ] 查詢使用量
|
||||
- [ ] WebDAV/SMB 路徑管理
|
||||
|
||||
**NAS 配額規則**:
|
||||
- Junior: 50 GB
|
||||
- Mid: 100 GB
|
||||
- Senior: 200 GB
|
||||
- Manager: 500 GB
|
||||
|
||||
#### 3.3 配額自動計算 ⏳
|
||||
- [ ] 根據職級自動設定郵件配額
|
||||
- [ ] 根據最高職級自動設定 NAS 配額
|
||||
- [ ] 職級變更時自動更新配額
|
||||
- [ ] 配額警示 (使用率 > 80%)
|
||||
|
||||
#### 3.4 整合測試 ⏳
|
||||
- [ ] 端到端測試
|
||||
- [ ] Keycloak 整合測試
|
||||
- [ ] 郵件服務整合測試
|
||||
- [ ] NAS 服務整合測試
|
||||
- [ ] 完整流程測試 (創建員工 → 創建所有資源)
|
||||
|
||||
### Phase 4: 前端開發 (預計 2 週)
|
||||
|
||||
#### 4.1 React 專案初始化 ⏳
|
||||
- [ ] 創建 `frontend/` 目錄
|
||||
- [ ] Vite + React + TypeScript 設置
|
||||
- [ ] Tailwind CSS 配置
|
||||
- [ ] React Router 配置
|
||||
- [ ] TanStack Query (React Query) 配置
|
||||
|
||||
#### 4.2 UI 組件開發 ⏳
|
||||
- [ ] 員工列表頁面
|
||||
- [ ] 員工詳情頁面
|
||||
- [ ] 員工創建/編輯表單
|
||||
- [ ] 身份管理頁面
|
||||
- [ ] 組織架構管理頁面
|
||||
- [ ] 審計日誌查詢頁面
|
||||
|
||||
#### 4.3 Keycloak 前端整合 ⏳
|
||||
- [ ] Keycloak JS 客戶端配置
|
||||
- [ ] 登入/登出流程
|
||||
- [ ] Token 自動刷新
|
||||
- [ ] 受保護的路由
|
||||
|
||||
---
|
||||
|
||||
## 🗂️ 檔案清單
|
||||
|
||||
### 資料庫 (database/)
|
||||
```
|
||||
database/
|
||||
├── schema.sql # PostgreSQL Schema v2.0
|
||||
├── test_schema.sql # 測試腳本 (9 個測試項目)
|
||||
├── docker-compose.yml # PostgreSQL 16 + pgAdmin 4
|
||||
├── TESTING.md # 測試指南 (完整文檔)
|
||||
└── README.md # 資料庫說明
|
||||
```
|
||||
|
||||
### 後端 (backend/)
|
||||
```
|
||||
backend/
|
||||
├── app/
|
||||
│ ├── core/
|
||||
│ │ ├── config.py # 環境配置
|
||||
│ │ ├── logging_config.py # 日誌配置
|
||||
│ │ └── __init__.py
|
||||
│ ├── db/
|
||||
│ │ ├── base.py # Base 類別
|
||||
│ │ ├── session.py # Session 管理
|
||||
│ │ └── __init__.py
|
||||
│ ├── models/
|
||||
│ │ ├── employee.py # Employee Model
|
||||
│ │ ├── business_unit.py # BusinessUnit Model
|
||||
│ │ ├── department.py # Department Model
|
||||
│ │ ├── employee_identity.py # EmployeeIdentity Model
|
||||
│ │ ├── network_drive.py # NetworkDrive Model
|
||||
│ │ ├── audit_log.py # AuditLog Model
|
||||
│ │ └── __init__.py
|
||||
│ ├── schemas/
|
||||
│ │ ├── base.py # 基礎 Schema
|
||||
│ │ ├── employee.py # Employee Schemas
|
||||
│ │ ├── business_unit.py # BusinessUnit Schemas
|
||||
│ │ ├── department.py # Department Schemas
|
||||
│ │ ├── employee_identity.py # EmployeeIdentity Schemas
|
||||
│ │ ├── network_drive.py # NetworkDrive Schemas
|
||||
│ │ ├── audit_log.py # AuditLog Schemas
|
||||
│ │ ├── response.py # 通用響應 Schema
|
||||
│ │ └── __init__.py
|
||||
│ ├── api/
|
||||
│ │ ├── deps.py # 依賴注入
|
||||
│ │ ├── v1/
|
||||
│ │ │ ├── router.py # 主路由
|
||||
│ │ │ ├── employees.py # 員工 API (7 個端點)
|
||||
│ │ │ ├── business_units.py # 事業部 API (6 個端點)
|
||||
│ │ │ ├── departments.py # 部門 API (5 個端點)
|
||||
│ │ │ ├── identities.py # 身份 API (5 個端點)
|
||||
│ │ │ ├── network_drives.py # 網路硬碟 API (7 個端點)
|
||||
│ │ │ ├── audit_logs.py # 審計日誌 API (5 個端點)
|
||||
│ │ │ └── __init__.py
|
||||
│ │ └── __init__.py
|
||||
│ ├── services/ # 業務邏輯服務 (待開發)
|
||||
│ │ └── __init__.py
|
||||
│ ├── main.py # FastAPI 主程式
|
||||
│ └── __init__.py
|
||||
├── tests/ # 測試 (待開發)
|
||||
├── alembic/ # 資料庫遷移 (待設置)
|
||||
├── requirements.txt # Python 依賴
|
||||
├── .env.example # 環境變數範例
|
||||
├── .gitignore # Git 忽略清單
|
||||
├── README.md # 專案說明
|
||||
├── PROGRESS.md # 開發進度
|
||||
└── API_COMPLETE.md # API 完成摘要
|
||||
```
|
||||
|
||||
### 前端 (frontend/) - 待創建
|
||||
```
|
||||
frontend/ # 待創建
|
||||
├── src/
|
||||
│ ├── components/
|
||||
│ ├── pages/
|
||||
│ ├── lib/
|
||||
│ ├── hooks/
|
||||
│ └── routes/
|
||||
├── public/
|
||||
├── package.json
|
||||
└── README.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 統計數據
|
||||
|
||||
### 代碼統計
|
||||
- **Python 文件**: 30+
|
||||
- **代碼行數**: 約 3500+ 行
|
||||
- **SQL 代碼**: 約 230 行
|
||||
- **文檔**: 6 個 Markdown 文件
|
||||
|
||||
### 功能統計
|
||||
- **資料庫表格**: 6 個
|
||||
- **SQLAlchemy Models**: 6 個
|
||||
- **Pydantic Schema 模組**: 8 個
|
||||
- **API 端點**: 35 個
|
||||
- **已測試**: 資料庫 Schema (9 個測試項目)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 如何啟動
|
||||
|
||||
### 1. 資料庫
|
||||
```bash
|
||||
cd W:\DevOps-Workspace\3.Develop\4.HR_Portal\database
|
||||
docker-compose up -d
|
||||
|
||||
# 測試
|
||||
docker exec -i hr-portal-db-test psql -U hr_admin -d hr_portal < test_schema.sql
|
||||
```
|
||||
|
||||
### 2. 後端 API
|
||||
```bash
|
||||
cd W:\DevOps-Workspace\3.Develop\4.HR_Portal\backend
|
||||
|
||||
# 創建虛擬環境
|
||||
python -m venv venv
|
||||
venv\Scripts\activate
|
||||
|
||||
# 安裝依賴
|
||||
pip install -r requirements.txt
|
||||
|
||||
# 配置環境變數
|
||||
cp .env.example .env
|
||||
# 編輯 .env
|
||||
|
||||
# 啟動開發伺服器
|
||||
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
|
||||
```
|
||||
|
||||
**訪問**:
|
||||
- API 文檔: http://localhost:8000/docs
|
||||
- ReDoc: http://localhost:8000/redoc
|
||||
- 健康檢查: http://localhost:8000/health
|
||||
|
||||
### 3. pgAdmin (資料庫管理)
|
||||
- URL: http://localhost:5050
|
||||
- Email: admin@lab.taipei
|
||||
- Password: admin
|
||||
|
||||
---
|
||||
|
||||
## 🎯 下一步行動
|
||||
|
||||
### 立即可做 (本週)
|
||||
1. ✅ 完成 Phase 1 基礎建設 (已完成)
|
||||
2. ⏳ 實作 Keycloak 服務整合
|
||||
3. ⏳ 實作審計日誌自動記錄
|
||||
4. ⏳ 添加單元測試
|
||||
|
||||
### 短期目標 (2 週內)
|
||||
5. ⏳ 實作權限控制
|
||||
6. ⏳ 郵件服務整合
|
||||
7. ⏳ NAS 服務整合
|
||||
8. ⏳ 整合測試
|
||||
|
||||
### 中期目標 (1 個月內)
|
||||
9. ⏳ React 前端開發
|
||||
10. ⏳ 完整的端到端測試
|
||||
11. ⏳ 生產環境部署
|
||||
|
||||
---
|
||||
|
||||
## 📝 備註
|
||||
|
||||
### 重要設計決策
|
||||
|
||||
1. **軟刪除策略**
|
||||
- 所有刪除操作都是軟刪除
|
||||
- 只標記為停用,不實際刪除資料
|
||||
- 保留審計追蹤
|
||||
|
||||
2. **自動化原則**
|
||||
- 員工編號自動生成 (EMP001, EMP002, ...)
|
||||
- SSO 帳號自動生成 (username_base@email_domain)
|
||||
- 主要身份自動管理
|
||||
|
||||
3. **多身份設計**
|
||||
- 符合實際業務需求
|
||||
- 支援跨部門、跨事業部工作
|
||||
- SSO 帳號和郵件帳號一一對應
|
||||
|
||||
4. **資料完整性優先**
|
||||
- 嚴格的外鍵約束
|
||||
- 業務規則驗證
|
||||
- 防止資料不一致
|
||||
|
||||
### 技術債
|
||||
- [ ] Alembic 遷移設置 (目前使用 SQLAlchemy 自動創建)
|
||||
- [ ] API 版本控制策略
|
||||
- [ ] 錯誤訊息國際化
|
||||
- [ ] 性能優化 (查詢優化、快取策略)
|
||||
|
||||
---
|
||||
|
||||
**專案狀態**: 🟢 健康
|
||||
**風險評估**: 🟢 低風險
|
||||
**下一個里程碑**: Phase 2 完成 (預計 1 週後)
|
||||
|
||||
**最後更新**: 2026-02-11
|
||||
**更新者**: Claude AI
|
||||
Reference in New Issue
Block a user