668 lines
20 KiB
Plaintext
668 lines
20 KiB
Plaintext
夥伴對齊系統 - 軟體設計文件 (SDD)
|
||
1. 文件資訊
|
||
版本: 1.0
|
||
最後更新: 2025年10月
|
||
文件狀態: 初版
|
||
專案類型: 內部管理系統
|
||
|
||
2. 執行摘要
|
||
2.1 專案目標
|
||
建立一套完整的夥伴能力評估與對齊管理平台,透過視覺化拖拉介面簡化能力評估流程,並整合STAR回饋機制與積分排名系統,提升組織內部人才發展與管理效率。
|
||
2.2 核心價值主張
|
||
* 效率提升: 拖拉式操作減少50%以上評估時間
|
||
* 結構化回饋: STAR框架確保回饋品質與可追蹤性
|
||
* 激勵機制: 積分排名系統促進員工持續成長
|
||
* 資料驅動: 完整的評估資料分析與匯出功能
|
||
2.3 關鍵成功指標
|
||
* 評估完成率提升30%
|
||
* 回饋品質標準化達90%
|
||
* 系統使用率達80%以上
|
||
|
||
3. 系統架構設計
|
||
3.1 技術架構概覽
|
||
┌─────────────────────────────────────────┐
|
||
│ 前端層 (Presentation) │
|
||
│ HTML5 + Bootstrap 5 + JavaScript │
|
||
└─────────────┬───────────────────────────┘
|
||
│ HTTP/REST API
|
||
┌─────────────▼───────────────────────────┐
|
||
│ 應用層 (Application) │
|
||
│ Python Flask + SQLAlchemy │
|
||
└─────────────┬───────────────────────────┘
|
||
│ ORM
|
||
┌─────────────▼───────────────────────────┐
|
||
│ 資料層 (Data) │
|
||
│ MySQL 5.7+ │
|
||
└─────────────────────────────────────────┘
|
||
3.2 系統分層說明
|
||
3.2.1 前端層
|
||
* 職責: 使用者介面、互動邏輯、資料展示
|
||
* 技術選型:
|
||
o Bootstrap 5: 響應式UI框架
|
||
o 原生JavaScript: 拖拉功能、表單驗證
|
||
o HTML5 Drag & Drop API: 能力評估拖拉介面
|
||
* 關鍵模組:
|
||
o app.js: 全域工具函數與API通訊
|
||
o assessment.js: 能力評估拖拉邏輯
|
||
o admin.js: 後台管理介面邏輯
|
||
3.2.2 應用層
|
||
* 職責: 業務邏輯、資料處理、API路由
|
||
* 技術選型:
|
||
o Flask 2.x: 輕量化Web框架
|
||
o SQLAlchemy: ORM資料庫抽象層
|
||
o Flask-CORS: 跨域請求處理
|
||
o pandas + openpyxl: 資料匯出
|
||
* 安全機制:
|
||
o 環境變數管理敏感資訊
|
||
o CORS跨域限制
|
||
o 輸入驗證與SQL注入防護
|
||
o 錯誤處理機制
|
||
3.2.3 資料層
|
||
* 職責: 資料持久化、查詢優化
|
||
* 技術選型: MySQL 5.7+
|
||
* 關鍵特性:
|
||
o 事務處理保證資料一致性
|
||
o 索引優化查詢效能
|
||
o JSON欄位儲存彈性資料
|
||
|
||
4. 資料庫設計
|
||
4.1 ER關係圖
|
||
┌─────────────────┐ ┌──────────────────┐
|
||
│ assessments │ │ capabilities │
|
||
│ (能力評估紀錄) │ │ (能力項目定義) │
|
||
└─────────────────┘ └──────────────────┘
|
||
│
|
||
│
|
||
▼
|
||
┌─────────────────┐ ┌──────────────────┐
|
||
│ star_feedbacks │─────?│ employee_points │
|
||
│ (STAR回饋) │ │ (員工積分) │
|
||
└─────────────────┘ └──────────────────┘
|
||
│ │
|
||
│ ▼
|
||
│ ┌──────────────────┐
|
||
└──────────────?│ monthly_rankings │
|
||
│ (月度排名) │
|
||
└──────────────────┘
|
||
4.2 資料表結構
|
||
4.2.1 assessments (能力評估紀錄)
|
||
欄位名稱
|
||
資料型別
|
||
說明
|
||
約束
|
||
id
|
||
INT
|
||
主鍵
|
||
PK, AUTO_INCREMENT
|
||
department
|
||
VARCHAR(100)
|
||
部門
|
||
NOT NULL
|
||
position
|
||
VARCHAR(100)
|
||
職位
|
||
NOT NULL
|
||
employee_name
|
||
VARCHAR(100)
|
||
員工姓名
|
||
NULL
|
||
assessment_data
|
||
JSON
|
||
評估資料
|
||
NOT NULL
|
||
created_at
|
||
DATETIME
|
||
建立時間
|
||
DEFAULT CURRENT_TIMESTAMP
|
||
updated_at
|
||
DATETIME
|
||
更新時間
|
||
ON UPDATE CURRENT_TIMESTAMP
|
||
索引策略:
|
||
* idx_department: (department)
|
||
* idx_position: (position)
|
||
* idx_created_at: (created_at)
|
||
4.2.2 capabilities (能力項目定義)
|
||
欄位名稱
|
||
資料型別
|
||
說明
|
||
約束
|
||
id
|
||
INT
|
||
主鍵
|
||
PK, AUTO_INCREMENT
|
||
name
|
||
VARCHAR(200)
|
||
能力名稱
|
||
NOT NULL, UNIQUE
|
||
l1_description
|
||
TEXT
|
||
L1等級說明
|
||
NULL
|
||
l2_description
|
||
TEXT
|
||
L2等級說明
|
||
NULL
|
||
l3_description
|
||
TEXT
|
||
L3等級說明
|
||
NULL
|
||
l4_description
|
||
TEXT
|
||
L4等級說明
|
||
NULL
|
||
l5_description
|
||
TEXT
|
||
L5等級說明
|
||
NULL
|
||
is_active
|
||
BOOLEAN
|
||
是否啟用
|
||
DEFAULT TRUE
|
||
4.2.3 star_feedbacks (STAR回饋)
|
||
欄位名稱
|
||
資料型別
|
||
說明
|
||
約束
|
||
id
|
||
INT
|
||
主鍵
|
||
PK, AUTO_INCREMENT
|
||
evaluator_name
|
||
VARCHAR(100)
|
||
評分者姓名
|
||
NOT NULL
|
||
evaluatee_name
|
||
VARCHAR(100)
|
||
受評者姓名
|
||
NOT NULL
|
||
evaluatee_department
|
||
VARCHAR(100)
|
||
受評者部門
|
||
NOT NULL
|
||
evaluatee_position
|
||
VARCHAR(100)
|
||
受評者職位
|
||
NOT NULL
|
||
situation
|
||
TEXT
|
||
情境描述
|
||
NOT NULL
|
||
task
|
||
TEXT
|
||
任務說明
|
||
NOT NULL
|
||
action
|
||
TEXT
|
||
行動描述
|
||
NOT NULL
|
||
result
|
||
TEXT
|
||
結果說明
|
||
NOT NULL
|
||
score
|
||
INT
|
||
評分(1-5)
|
||
CHECK (score BETWEEN 1 AND 5)
|
||
points_earned
|
||
INT
|
||
獲得積分
|
||
NOT NULL
|
||
feedback_date
|
||
DATE
|
||
回饋日期
|
||
NOT NULL
|
||
created_at
|
||
DATETIME
|
||
建立時間
|
||
DEFAULT CURRENT_TIMESTAMP
|
||
索引策略:
|
||
* idx_evaluatee: (evaluatee_name, evaluatee_department)
|
||
* idx_feedback_date: (feedback_date)
|
||
積分計算規則: points_earned = score × 10
|
||
4.2.4 employee_points (員工積分)
|
||
欄位名稱
|
||
資料型別
|
||
說明
|
||
約束
|
||
id
|
||
INT
|
||
主鍵
|
||
PK, AUTO_INCREMENT
|
||
employee_name
|
||
VARCHAR(100)
|
||
員工姓名
|
||
NOT NULL, UNIQUE
|
||
department
|
||
VARCHAR(100)
|
||
部門
|
||
NOT NULL
|
||
position
|
||
VARCHAR(100)
|
||
職位
|
||
NOT NULL
|
||
total_points
|
||
INT
|
||
總積分
|
||
DEFAULT 0
|
||
monthly_points
|
||
INT
|
||
當月積分
|
||
DEFAULT 0
|
||
last_updated
|
||
DATETIME
|
||
最後更新時間
|
||
ON UPDATE CURRENT_TIMESTAMP
|
||
索引策略:
|
||
* idx_total_points: (total_points DESC)
|
||
* idx_monthly_points: (monthly_points DESC)
|
||
4.2.5 monthly_rankings (月度排名)
|
||
欄位名稱
|
||
資料型別
|
||
說明
|
||
約束
|
||
id
|
||
INT
|
||
主鍵
|
||
PK, AUTO_INCREMENT
|
||
ranking_month
|
||
DATE
|
||
排名月份
|
||
NOT NULL
|
||
employee_name
|
||
VARCHAR(100)
|
||
員工姓名
|
||
NOT NULL
|
||
department
|
||
VARCHAR(100)
|
||
部門
|
||
NOT NULL
|
||
position
|
||
VARCHAR(100)
|
||
職位
|
||
NOT NULL
|
||
total_points
|
||
INT
|
||
該月總積分
|
||
NOT NULL
|
||
ranking
|
||
INT
|
||
排名
|
||
NOT NULL
|
||
created_at
|
||
DATETIME
|
||
建立時間
|
||
DEFAULT CURRENT_TIMESTAMP
|
||
索引策略:
|
||
* idx_ranking_month: (ranking_month, ranking)
|
||
* unique_month_employee: (ranking_month, employee_name) UNIQUE
|
||
|
||
5. 功能模組設計
|
||
5.1 模組架構圖
|
||
┌─────────────────────────────────────────────────┐
|
||
│ 系統主頁 │
|
||
│ (index.html) │
|
||
└──────┬─────────┬─────────┬─────────┬───────────┘
|
||
│ │ │ │
|
||
┌───▼───┐ ┌──▼───┐ ┌───▼───┐ ┌──▼────┐
|
||
│能力評估│ │STAR │ │排行榜 │ │管理 │
|
||
│模組 │ │回饋 │ │模組 │ │後台 │
|
||
│ │ │模組 │ │ │ │模組 │
|
||
└───────┘ └──────┘ └───────┘ └───────┘
|
||
5.2 核心功能模組
|
||
5.2.1 能力評估模組
|
||
功能目標: 提供直觀的能力評估介面,支援拖拉式操作進行能力等級分配
|
||
輸入:
|
||
* 部門選擇 (必填)
|
||
* 職位選擇 (必填)
|
||
* 員工姓名 (選填)
|
||
* 能力項目拖拉操作
|
||
處理邏輯:
|
||
1. 載入能力項目清單
|
||
2. 初始化5個等級容器 (L1-L5)
|
||
3. 監聽拖拉事件
|
||
4. 驗證必填欄位
|
||
5. 組裝評估資料JSON
|
||
6. 提交至後端API
|
||
輸出:
|
||
* 評估結果儲存至資料庫
|
||
* 顯示成功/失敗訊息
|
||
關鍵技術:
|
||
// 拖拉事件處理
|
||
element.addEventListener('dragstart', handleDragStart);
|
||
element.addEventListener('dragover', handleDragOver);
|
||
element.addEventListener('drop', handleDrop);
|
||
|
||
// 資料結構
|
||
{
|
||
"department": "技術部",
|
||
"position": "資深工程師",
|
||
"employee_name": "張三",
|
||
"capabilities": {
|
||
"L1": ["能力1", "能力2"],
|
||
"L2": ["能力3"],
|
||
...
|
||
}
|
||
}
|
||
5.2.2 STAR回饋模組
|
||
功能目標: 結構化回饋收集,促進有效的績效溝通與記錄
|
||
STAR框架說明:
|
||
* S - Situation (情境): 描述事件發生的背景脈絡
|
||
* T - Task (任務): 說明需要達成的目標或責任
|
||
* A - Action (行動): 詳述採取的具體步驟與策略
|
||
* R - Result (結果): 量化/質化的成果與影響
|
||
輸入驗證規則:
|
||
欄位
|
||
驗證規則
|
||
評分者姓名
|
||
必填, 2-50字元
|
||
受評者姓名
|
||
必填, 2-50字元
|
||
部門
|
||
必填
|
||
職位
|
||
必填
|
||
評分
|
||
必填, 1-5整數
|
||
S/T/A/R
|
||
各必填, 最少10字元
|
||
回饋日期
|
||
必填, 不可未來日期
|
||
積分計算:
|
||
points_earned = score * 10
|
||
# 範例: 評分4分 → 獲得40積分
|
||
業務流程:
|
||
1. 填寫基本資訊 (評分者、受評者)
|
||
2. 選擇評分 (1-5分)
|
||
3. 按STAR結構填寫回饋
|
||
4. 預覽回饋內容
|
||
5. 提交回饋
|
||
6. 自動更新受評者積分
|
||
7. 觸發排名重算 (月度)
|
||
5.2.3 積分排名模組
|
||
功能目標: 展示員工積分排名,提供激勵機制與績效可視化
|
||
排名類型:
|
||
1. 總積分排行榜: 累計所有歷史積分
|
||
2. 月度排行榜: 特定月份的積分排名
|
||
3. 部門排行榜: 按部門篩選的排名
|
||
排名計算邏輯:
|
||
# 每月1號自動執行
|
||
def calculate_monthly_ranking():
|
||
# 1. 統計上月所有員工積分
|
||
# 2. 按積分降序排序
|
||
# 3. 處理並列排名
|
||
# 4. 寫入 monthly_rankings 表
|
||
# 5. 重置 employee_points.monthly_points
|
||
排名規則:
|
||
* 積分相同時並列同名次
|
||
* 下一名次跳號 (例: 2名並列第3, 下一名為第5)
|
||
* 零積分不列入排名
|
||
查詢功能:
|
||
* 年份選擇器
|
||
* 月份選擇器
|
||
* 部門篩選器
|
||
* 歷史排名比較
|
||
5.2.4 資料管理模組
|
||
功能目標: 提供完整的資料檢視、查詢、匯出功能
|
||
查詢條件:
|
||
* 部門篩選
|
||
* 職位篩選
|
||
* 員工姓名搜尋
|
||
* 日期區間篩選
|
||
* 評估類型篩選
|
||
分頁設計:
|
||
* 每頁顯示20筆
|
||
* 顯示總筆數
|
||
* 頁碼導航
|
||
匯出功能:
|
||
1. Excel格式 (.xlsx):
|
||
o 使用 openpyxl 生成
|
||
o 包含格式化表頭
|
||
o 支援多工作表
|
||
2. CSV格式:
|
||
o UTF-8 BOM編碼 (Excel相容)
|
||
o 逗號分隔
|
||
o 引號包覆特殊字元
|
||
匯出欄位:
|
||
評估資料匯出:
|
||
- ID, 部門, 職位, 員工姓名, 評估資料, 建立時間
|
||
|
||
STAR回饋匯出:
|
||
- ID, 評分者, 受評者, 部門, 職位, S/T/A/R內容, 評分, 積分, 回饋日期, 建立時間
|
||
|
||
6. API端點設計
|
||
6.1 RESTful API規範
|
||
基礎URL: http://{host}:{port}
|
||
Content-Type: application/json
|
||
字元編碼: UTF-8
|
||
6.2 API端點清單
|
||
6.2.1 能力評估相關
|
||
GET /api/capabilities
|
||
* 功能: 取得所有啟用的能力項目
|
||
* 請求參數: 無
|
||
* 回應範例:
|
||
{
|
||
"capabilities": [
|
||
{
|
||
"id": 1,
|
||
"name": "程式設計與開發",
|
||
"l1_description": "...",
|
||
"l2_description": "...",
|
||
"l3_description": "...",
|
||
"l4_description": "...",
|
||
"l5_description": "..."
|
||
}
|
||
]
|
||
}
|
||
POST /api/assessments
|
||
* 功能: 提交能力評估
|
||
* 請求Body:
|
||
{
|
||
"department": "技術部",
|
||
"position": "資深工程師",
|
||
"employee_name": "張三",
|
||
"assessment_data": {
|
||
"L1": ["能力1"],
|
||
"L2": ["能力2", "能力3"],
|
||
...
|
||
}
|
||
}
|
||
* 驗證規則:
|
||
o department: 必填
|
||
o position: 必填
|
||
o assessment_data: 必填, 至少一個能力項目
|
||
* 成功回應 (201):
|
||
{
|
||
"success": true,
|
||
"message": "評估提交成功",
|
||
"assessment_id": 123
|
||
}
|
||
6.2.2 STAR回饋相關
|
||
POST /api/star-feedbacks
|
||
* 功能: 提交STAR回饋
|
||
* 請求Body:
|
||
{
|
||
"evaluator_name": "李四",
|
||
"evaluatee_name": "張三",
|
||
"evaluatee_department": "技術部",
|
||
"evaluatee_position": "資深工程師",
|
||
"situation": "專案緊急需求...",
|
||
"task": "需在48小時內...",
|
||
"action": "組織跨部門會議...",
|
||
"result": "成功交付功能...",
|
||
"score": 4,
|
||
"feedback_date": "2025-10-15"
|
||
}
|
||
* 業務邏輯:
|
||
1. 計算積分: points_earned = score * 10
|
||
2. 更新 employee_points 表
|
||
3. 新增回饋記錄
|
||
* 成功回應 (201):
|
||
{
|
||
"success": true,
|
||
"message": "回饋提交成功",
|
||
"points_earned": 40
|
||
}
|
||
6.2.3 排名相關
|
||
GET /api/rankings/total
|
||
* 功能: 取得總積分排行榜
|
||
* 請求參數:
|
||
o department (選填): 部門篩選
|
||
o limit (選填): 顯示筆數, 預設50
|
||
* 回應範例:
|
||
{
|
||
"rankings": [
|
||
{
|
||
"rank": 1,
|
||
"employee_name": "張三",
|
||
"department": "技術部",
|
||
"position": "資深工程師",
|
||
"total_points": 450
|
||
}
|
||
]
|
||
}
|
||
GET /api/rankings/monthly
|
||
* 功能: 取得月度排行榜
|
||
* 請求參數:
|
||
o year (必填): 年份
|
||
o month (必填): 月份 (1-12)
|
||
o department (選填): 部門篩選
|
||
* 回應範例:
|
||
{
|
||
"year": 2025,
|
||
"month": 10,
|
||
"rankings": [...]
|
||
}
|
||
POST /api/rankings/calculate
|
||
* 功能: 手動觸發月度排名計算
|
||
* 權限: 管理員
|
||
* 請求Body:
|
||
{
|
||
"year": 2025,
|
||
"month": 10
|
||
}
|
||
6.2.4 資料管理相關
|
||
GET /api/assessments
|
||
* 功能: 查詢評估資料
|
||
* 請求參數:
|
||
o page (選填): 頁碼, 預設1
|
||
o per_page (選填): 每頁筆數, 預設20
|
||
o department (選填): 部門篩選
|
||
o position (選填): 職位篩選
|
||
o employee_name (選填): 員工姓名搜尋
|
||
* 回應範例:
|
||
{
|
||
"assessments": [...],
|
||
"total": 150,
|
||
"page": 1,
|
||
"per_page": 20,
|
||
"pages": 8
|
||
}
|
||
GET /api/export/assessments
|
||
* 功能: 匯出評估資料
|
||
* 請求參數:
|
||
o format: excel | csv
|
||
o 其他篩選條件同上
|
||
* 回應: 檔案下載
|
||
GET /api/export/star-feedbacks
|
||
* 功能: 匯出STAR回饋資料
|
||
* 請求參數:
|
||
o format: excel | csv
|
||
o 篩選條件
|
||
|
||
7. 非功能需求
|
||
7.1 效能需求
|
||
指標
|
||
目標值
|
||
說明
|
||
頁面載入時間
|
||
< 2秒
|
||
首頁與主要功能頁
|
||
API回應時間
|
||
< 500ms
|
||
95百分位數
|
||
並發使用者
|
||
100+
|
||
同時在線使用者數
|
||
資料庫查詢
|
||
< 100ms
|
||
單次查詢時間
|
||
檔案匯出
|
||
< 5秒
|
||
1000筆資料以內
|
||
效能優化策略:
|
||
* 資料庫索引優化
|
||
* 前端資源壓縮與快取
|
||
* 分頁查詢降低負載
|
||
* 非同步處理大量資料匯出
|
||
7.2 安全需求
|
||
7.2.1 當前實作
|
||
? 已實作:
|
||
* 環境變數管理敏感資訊 (.env)
|
||
* CORS跨域請求限制
|
||
* SQL注入防護 (SQLAlchemy參數化查詢)
|
||
* XSS防護 (輸入驗證與清理)
|
||
* 錯誤訊息脫敏
|
||
* HTTPS支援 (需配置)
|
||
? 未實作 (生產環境必須):
|
||
* 使用者身份驗證
|
||
* Session管理
|
||
* 角色權限控制
|
||
* 操作日誌記錄
|
||
* API速率限制
|
||
7.2.2 安全配置檢查清單
|
||
部署前必須完成:
|
||
□ 生成安全的 SECRET_KEY (32字元以上)
|
||
□ 設定強密碼的資料庫帳號
|
||
□ 關閉生產環境 DEBUG 模式
|
||
□ 配置正確的 CORS_ORIGINS
|
||
□ 啟用 HTTPS (Let's Encrypt)
|
||
□ 定期備份資料庫
|
||
□ 實作使用者認證系統
|
||
7.2.3 建議的權限分級
|
||
角色
|
||
權限
|
||
一般員工
|
||
填寫評估、檢視自己的資料
|
||
主管
|
||
評估下屬、檢視部門資料
|
||
HR
|
||
檢視所有資料、匯出報表
|
||
系統管理員
|
||
所有權限、系統設定
|
||
7.3 可用性需求
|
||
目標: 系統可用性 ? 99%
|
||
容錯機制:
|
||
* 資料庫連線重試機制
|
||
* 優雅的錯誤處理
|
||
* 友善的錯誤提示訊息
|
||
* 表單資料暫存 (防止誤關閉)
|
||
備份策略:
|
||
* 每日自動資料庫備份
|
||
* 保留30天備份歷史
|
||
* 異地備份 (建議)
|
||
7.4 可維護性需求
|
||
程式碼品質:
|
||
* 模組化設計
|
||
* 清晰的註解
|
||
* 遵循PEP 8規範
|
||
* 版本控制 (Git)
|
||
文件完整性:
|
||
* API文件
|
||
* 資料庫Schema文件
|
||
* 部署手冊
|
||
* 使用者手冊
|
||
7.5 相容性需求
|
||
瀏覽器支援:
|
||
* Chrome 90+
|
||
* Firefox 88+
|
||
* Safari 14+
|
||
* Edge 90+
|
||
* 不支援 IE
|
||
裝置支援:
|
||
* 桌面電腦 (主要)
|
||
* 平板電腦 (響應式)
|
||
* 手機 (有限支援)
|
||
螢幕解析度:
|
||
* 最低: 1280x720
|
||
* 建議: 1920x1080
|
||
|
||
8. 部署架構
|
||
8.1 開發環境
|
||
開發機器
|
||
├── Python 3.8+ 虛擬環境
|
||
├── MySQL 5.7+ 本地實例
|
||
└── Flask 開發伺服器 (port 5000)
|
||
環境變數 (.env):
|
||
FLASK_ENV=development
|
||
FLASK_DEBUG=True
|
||
FLASK_HOST=127.0.0.1
|
||
FLASK_PORT=5000
|
||
DB_HOST=localhost
|
||
DB_PORT=3306
|
||
DB_NAME=partner_alignment_dev
|
||
DB_USER=dev_user
|
||
DB_PASSWORD=dev_password
|
||
SECRET_KEY=dev_secret_key_for_testing_only
|
||
CORS_ORIGINS=http://localhost:5000,http://127.0.0.1:5000
|
||
8.2 生產環境 (建議架構)
|
||
Internet
|
||
↓
|
||
[Cloudflare / CDN]
|
||
↓
|
||
[Nginx 反向代理]
|
||
(Port 80/443)
|
||
↓
|
||
┌───────────┴───────────┐
|
||
↓ ↓
|
||
[Gunicorn Worker 1] [Gunicorn Worker N]
|
||
(Flask App) (Flask App)
|
||
↓ ↓
|
||
└───────────┬───────────┘
|
||
↓
|
||
[MySQL Master/Slave]
|
||
↓
|
||
[定期備份至S3]
|
||
硬體需求:
|
||
元件
|
||
最低配置
|
||
建議配置
|
||
CPU
|
||
2核心
|
||
4核心
|
||
RAM
|
||
4GB
|
||
8GB
|
||
儲存
|
||
20GB SSD
|
||
50GB SSD
|
||
頻寬
|
||
10Mbps
|
||
100Mbps
|
||
軟體堆疊:
|
||
* OS: Ubuntu 22.04 LTS
|
||
* Python: 3.10+
|
||
* MySQL: 8.0+
|
||
* Nginx: 1.22+
|
||
* Gunicorn: 20.1+
|
||
8.3 部署步驟
|
||
步驟1: 系統準備
|
||
# 更新系統
|
||
sudo apt update && sudo apt upgrade -y
|
||
|
||
# 安裝必要套件
|
||
sudo apt install python3-pip python3-venv mysql-server nginx -y
|
||
步驟2: 應用程式部署
|
||
# 建立專案目錄
|
||
sudo mkdir -p /var/www/partner-alignment
|
||
cd /var/www/partner-alignment
|
||
|
||
# 複製程式碼
|
||
git clone <repository-url> .
|
||
|
||
# 建立虛擬環境
|
||
python3 -m venv venv
|
||
source venv/bin/activate
|
||
|
||
# 安裝依賴
|
||
pip install -r requirements.txt
|
||
pip install gunicorn
|
||
步驟3: 環境設定
|
||
# 建立生產環境設定
|
||
cp .env.example .env
|
||
nano .env
|
||
|
||
# 設定資料庫
|
||
mysql -u root -p < schema.sql
|
||
生產環境 .env:
|
||
FLASK_ENV=production
|
||
FLASK_DEBUG=False
|
||
FLASK_HOST=127.0.0.1
|
||
FLASK_PORT=5000
|
||
DB_HOST=localhost
|
||
DB_PORT=3306
|
||
DB_NAME=partner_alignment_prod
|
||
DB_USER=prod_user
|
||
DB_PASSWORD=<強密碼>
|
||
SECRET_KEY=<64字元隨機金鑰>
|
||
CORS_ORIGINS=https://your-domain.com
|
||
步驟4: Gunicorn設定
|
||
# 建立 systemd 服務檔
|
||
sudo nano /etc/systemd/system/partner-alignment.service
|
||
[Unit]
|
||
Description=Partner Alignment System
|
||
After=network.target
|
||
|
||
[Service]
|
||
User=www-data
|
||
Group=www-data
|
||
WorkingDirectory=/var/www/partner-alignment
|
||
Environment="PATH=/var/www/partner-alignment/venv/bin"
|
||
ExecStart=/var/www/partner-alignment/venv/bin/gunicorn \
|
||
--workers 4 \
|
||
--bind 127.0.0.1:5000 \
|
||
--timeout 120 \
|
||
--access-logfile /var/log/partner-alignment/access.log \
|
||
--error-logfile /var/log/partner-alignment/error.log \
|
||
app:app
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
# 啟動服務
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl start partner-alignment
|
||
sudo systemctl enable partner-alignment
|
||
步驟5: Nginx設定
|
||
sudo nano /etc/nginx/sites-available/partner-alignment
|
||
server {
|
||
listen 80;
|
||
server_name your-domain.com;
|
||
|
||
# 強制HTTPS
|
||
return 301 https://$server_name$request_uri;
|
||
}
|
||
|
||
server {
|
||
listen 443 ssl http2;
|
||
server_name your-domain.com;
|
||
|
||
# SSL憑證
|
||
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
|
||
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
|
||
|
||
# 安全標頭
|
||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||
add_header X-Content-Type-Options "nosniff" always;
|
||
add_header X-XSS-Protection "1; mode=block" always;
|
||
|
||
# 靜態檔案
|
||
location /static {
|
||
alias /var/www/partner-alignment/static;
|
||
expires 30d;
|
||
add_header Cache-Control "public, immutable";
|
||
}
|
||
|
||
# 應用程式
|
||
location / {
|
||
proxy_pass http://127.0.0.1:5000;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
}
|
||
}
|
||
# 啟用網站
|
||
sudo ln -s /etc/nginx/sites-available/partner-alignment /etc/nginx/sites-enabled/
|
||
sudo nginx -t
|
||
sudo systemctl restart nginx
|
||
步驟6: SSL憑證
|
||
# 安裝 Certbot
|
||
sudo apt install certbot python3-certbot-nginx -y
|
||
|
||
# 取得憑證
|
||
sudo certbot --nginx -d your-domain.com
|
||
8.4 監控與維護
|
||
日誌檔案位置:
|
||
* Gunicorn: /var/log/partner-alignment/
|
||
* Nginx: /var/log/nginx/
|
||
* MySQL: /var/log/mysql/
|
||
定期維護任務:
|
||
# 每日備份 (crontab -e)
|
||
0 2 * * * /usr/bin/mysqldump -u backup_user -p'password' partner_alignment_prod > /backup/db_$(date +\%Y\%m\%d).sql
|
||
|
||
# 每月排名計算
|
||
0 0 1 * * /var/www/partner-alignment/venv/bin/python /var/www/partner-alignment/monthly_ranking.py
|
||
|
||
9. 專案管理
|
||
9.1 開發里程碑
|
||
階段
|
||
交付項
|
||
預計時程
|
||
狀態
|
||
Phase 1
|
||
基礎架構 & 資料庫設計
|
||
Week 1-2
|
||
? 完成
|
||
Phase 2
|
||
能力評估模組
|
||
Week 3-4
|
||
? 完成
|
||
Phase 3
|
||
STAR回饋模組
|
||
Week 5-6
|
||
? 完成
|
||
Phase 4
|
||
積分排名系統
|
||
Week 7-8
|
||
? 完成
|
||
Phase 5
|
||
管理後台 & 匯出
|
||
Week 9-10
|
||
? 完成
|
||
Phase 6
|
||
測試 & 優化
|
||
Week 11-12
|
||
?? 進行中
|
||
Phase 7
|
||
身份驗證系統
|
||
Week 13-14
|
||
? 待開始
|
||
Phase 8
|
||
生產部署
|
||
Week 15
|
||
? 待開始
|
||
9.2 技術債務追蹤
|
||
高優先級:
|
||
1. ? 實作使用者身份驗證系統
|
||
2. ? 新增操作日誌記錄
|
||
3. ? 實作API速率限制
|
||
中優先級: 4. 優化大量資料匯出效能 5. 新增單元測試覆蓋率至80%+ 6. 實作前端表單驗證增強
|
||
低優先級: 7. 新增更多圖表視覺化 8. 支援多國語言 9. 行動裝置專用介面優化
|
||
9.3 測試策略
|
||
9.3.1 單元測試
|
||
* 覆蓋率目標: 70%+
|
||
* 測試框架: pytest
|
||
* 重點測試:
|
||
o 資料驗證邏輯
|
||
o 積分計算公式
|
||
o 排名演算法
|
||
9.3.2 整合測試
|
||
* API端點測試
|
||
* 資料庫CRUD操作
|
||
* 匯出功能測試
|
||
9.3.3 使用者接受測試 (UAT)
|
||
* 評估流程端到端測試
|
||
* 回饋提交完整流程
|
||
* 各種瀏覽器相容性測試
|
||
9.3.4 效能測試
|
||
* 負載測試: 100並發使用者
|
||
* 壓力測試: 找出系統瓶頸
|
||
* 長時間穩定性測試
|
||
|
||
10. 風險管理
|
||
10.1 風險識別與對策
|
||
風險項目
|
||
影響等級
|
||
發生機率
|
||
對策
|
||
無身份驗證導致資料外洩
|
||
?? 極高
|
||
高
|
||
Phase 7實作認證系統
|
||
資料庫無備份機制
|
||
?? 極高
|
||
中
|
||
設定自動每日備份
|
||
單點故障
|
||
?? 中
|
||
中
|
||
規劃主從式資料庫架構
|
||
效能瓶頸
|
||
?? 中
|
||
低
|
||
持續監控與優化
|
||
瀏覽器相容性問題
|
||
?? 低
|
||
低
|
||
多瀏覽器測試
|
||
10.2 應變計畫
|
||
資料遺失:
|
||
1. 立即停止系統運作
|
||
2. 從最近備份還原
|
||
3. 分析遺失原因
|
||
4. 檢討備份頻率
|
||
系統當機:
|
||
1. 檢查錯誤日誌
|
||
2. 重啟相關服務
|
||
3. 確認資料完整性
|
||
4. 通知相關人員
|
||
安全事件:
|
||
1. 隔離受影響系統
|
||
2. 收集證據與日誌
|
||
3. 評估損害範圍
|
||
4. 修補漏洞
|
||
5. 強制密碼重置
|
||
|
||
11. 附錄
|
||
11.1 詞彙表
|
||
術語
|
||
定義
|
||
能力對齊
|
||
將員工能力與組織目標或職位要求進行匹配的過程
|
||
STAR框架
|
||
Situation-Task-Action-Result,結構化回饋方法
|
||
L1-L5
|
||
能力等級,從L1(執行者)到L5(策略制定者)
|
||
拖拉式介面
|
||
使用滑鼠拖拉操作的直覺式使用者介面
|
||
ORM
|
||
Object-Relational Mapping,物件關聯映射
|
||
11.2 參考文件
|
||
* Flask官方文件
|
||
* SQLAlchemy文件
|
||
* Bootstrap 5文件
|
||
* MySQL文件
|
||
* Gunicorn部署指南
|
||
11.3 變更歷史
|
||
版本
|
||
日期
|
||
修改者
|
||
變更內容
|
||
1.0
|
||
2025-10-15
|
||
-
|
||
初版SDD文件建立
|
||
11.4 核准簽署
|
||
角色
|
||
姓名
|
||
簽名
|
||
日期
|
||
專案經理
|
||
|
||
|
||
|
||
技術負責人
|
||
|
||
|
||
|
||
產品負責人
|
||
|
||
|
||
|
||
品質保證
|
||
|
||
|
||
|
||
|
||
文件結束
|
||
|