- Custom Fields (FEAT-001): - CustomField and TaskCustomValue models with formula support - CRUD API for custom field management - Formula engine for calculated fields - Frontend: CustomFieldEditor, CustomFieldInput, ProjectSettings page - Task list API now includes custom_values - KanbanBoard displays custom field values - Gantt View (FEAT-003): - TaskDependency model with FS/SS/FF/SF dependency types - Dependency CRUD API with cycle detection - start_date field added to tasks - GanttChart component with Frappe Gantt integration - Dependency type selector in UI - Calendar View (FEAT-004): - CalendarView component with FullCalendar integration - Date range filtering API for tasks - Drag-and-drop date updates - View mode switching in Tasks page - File Encryption (FEAT-010): - AES-256-GCM encryption service - EncryptionKey model with key rotation support - Admin API for key management - Encrypted upload/download for confidential projects - Migrations: 011 (custom fields), 012 (encryption keys), 013 (task dependencies) - Updated issues.md with completion status 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
28 KiB
28 KiB
PROJECT CONTROL - Issue Tracking
審核日期: 2026-01-04 更新日期: 2026-01-05 整體完成度: 約 99% 已修復問題: 25 (CRIT-001
003, HIGH-001008, MED-001012, NEW-001002)
目錄
- 嚴重問題 (Critical)
- 高優先問題 (High)
- 中優先問題 (Medium)
- 低優先問題 (Low)
- 未實作功能 (Missing Features)
- 可訪問性問題 (Accessibility)
- 程式碼品質建議 (Code Quality)
嚴重問題 (Critical)
CRIT-001: JWT 密鑰硬編碼
- 類型: 安全漏洞
- 模組: Backend - Authentication
- 檔案:
backend/app/core/config.py:28 - 問題描述: JWT secret key 有硬編碼的預設值
"your-secret-key-change-in-production",若部署時未設定環境變數,所有 JWT token 都可被偽造。 - 影響: 完全繞過認證系統
- 建議修復:
JWT_SECRET_KEY: str = "" # 移除預設值 def __init__(self, **kwargs): super().__init__(**kwargs) if not self.JWT_SECRET_KEY or self.JWT_SECRET_KEY == "your-secret-key-change-in-production": raise ValueError("JWT_SECRET_KEY must be set in environment") - 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 使用 pydantic @field_validator 驗證 JWT_SECRET_KEY,拒絕空值和佔位符值
CRIT-002: 登入嘗試未記錄稽核日誌
- 類型: 安全漏洞
- 模組: Backend - Authentication / Audit
- 檔案:
backend/app/api/auth/router.py - 問題描述: Spec 要求記錄失敗的登入嘗試,但 auth router 未呼叫 AuditService.log_event() 記錄登入成功/失敗。
- 影響: 無法偵測暴力破解攻擊,稽核追蹤不完整
- 建議修復:
# 登入成功時 AuditService.log_event( db=db, event_type="user.login", resource_type="user", action=AuditAction.LOGIN, user_id=user.id, ... ) # 登入失敗時 AuditService.log_event( db=db, event_type="user.login_failed", ... ) - 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 在 login endpoint 添加 AuditService.log_event() 呼叫,記錄成功/失敗的登入嘗試,包含 IP 和 User-Agent
CRIT-003: 前端 API 路徑重複導致請求失敗
- 類型: Bug
- 模組: Frontend - Core
- 檔案:
frontend/src/pages/Spaces.tsx:29, 43frontend/src/pages/Projects.tsx:44-45, 61frontend/src/pages/Tasks.tsx:54-56, 73, 86
- 問題描述: API 呼叫使用
/api/spaces但 axios baseURL 已設為/api,導致實際請求路徑變成/api/api/spaces。 - 影響: Spaces、Projects、Tasks 頁面所有 API 呼叫都會失敗
- 建議修復:
// 錯誤: const response = await api.get('/api/spaces') // 正確: const response = await api.get('/spaces') - 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 移除 Spaces.tsx, Projects.tsx, Tasks.tsx, attachments.ts 中所有 API 路徑的
/api前綴
高優先問題 (High)
HIGH-001: 專案刪除使用硬刪除
- 類型: 資料完整性
- 模組: Backend - Projects
- 檔案:
backend/app/api/projects/router.py:268-307 - 問題描述: 專案刪除使用
db.delete(project)硬刪除,但 Audit Trail spec 要求所有刪除操作使用軟刪除。 - 影響: 資料遺失,稽核日誌無法參照已刪除專案
- 建議修復: 為 Project model 新增
is_deleted,deleted_at,deleted_by欄位,實作軟刪除 - 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 使用現有 is_active 欄位實作軟刪除,delete_project 設定 is_active=False 而非 db.delete()
HIGH-002: Redis Session Token 類型比對問題
- 類型: Bug
- 模組: Backend - Authentication
- 檔案:
backend/app/middleware/auth.py:43-50 - 問題描述: Redis
get()在某些配置下回傳 bytes,與字串 token 比對可能失敗。 - 影響: 使用者可能意外被登出
- 建議修復:
stored_token = redis_client.get(f"session:{user_id}") if stored_token is None: raise HTTPException(...) if isinstance(stored_token, bytes): stored_token = stored_token.decode('utf-8') if stored_token != token: raise HTTPException(...) - 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 在 middleware/auth.py 添加 bytes 類型檢查和 decode 處理
HIGH-003: 無 Rate Limiting 實作
- 類型: 安全漏洞
- 模組: Backend - API
- 檔案: 多個 API endpoints
- 問題描述: Spec 提及 rate limiting,但未實作任何速率限制中介軟體。
- 影響: API 易受暴力破解和 DoS 攻擊
- 建議修復:
from slowapi import Limiter from slowapi.util import get_remote_address limiter = Limiter(key_func=get_remote_address) @router.post("/login") @limiter.limit("5/minute") async def login(...): - 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 使用 slowapi 實作 rate limiting,login endpoint 限制 5 req/min,測試環境使用 memory storage
HIGH-004: 附件 API 缺少權限檢查
- 類型: 安全漏洞
- 模組: Backend - Attachments
- 檔案:
backend/app/api/attachments/router.py - 問題描述: 附件 endpoints 只檢查任務是否存在,未驗證當前使用者是否有權存取該任務的專案。
check_task_access函數存在但未被呼叫。 - 影響: 使用者可上傳/下載不應有權存取的任務附件
- 建議修復: 在每個 endpoint 加入
check_task_access(current_user, task, task.project)呼叫 - 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 新增 get_task_with_access_check 和 get_attachment_with_access_check 輔助函數,所有 endpoints 都使用這些函數進行權限驗證
HIGH-005: 任務視角僅有列表視角
- 類型: 功能缺失
- 模組: Frontend - Task Management
- 檔案:
frontend/src/pages/Tasks.tsx - 問題描述: Spec 要求 4 種視角 (Kanban, Gantt, List, Calendar),目前僅實作列表視角。
- 影響: 無法滿足不同工作流程需求
- 建議修復: 優先實作看板 (Kanban) 視角,支援拖拉變更狀態
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 新增 KanbanBoard.tsx 元件,支援 HTML5 drag-and-drop 變更狀態,Tasks.tsx 新增 List/Kanban 切換按鈕,偏好設定儲存於 localStorage
HIGH-006: 資源管理模組前端 UI 未開發
- 類型: 功能缺失
- 模組: Frontend - Resource Management
- 檔案: -
- 問題描述: 整個資源管理模組前端未開發,包括負載熱圖、容量規劃、專案健康看板。
- 影響: 主管無法視覺化查看團隊工作負載
- 建議修復: 開發 WorkloadHeatmap 元件和相關頁面
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 新增 WorkloadPage.tsx、WorkloadHeatmap.tsx、WorkloadUserDetail.tsx 元件,完整實作負載熱圖視覺化功能
HIGH-007: 協作/附件/觸發器元件未整合
- 類型: 功能缺失
- 模組: Frontend - Integration
- 檔案:
frontend/src/components/Comments.tsx- 未使用frontend/src/components/TaskAttachments.tsx- 未使用frontend/src/components/TriggerList.tsx- 未使用frontend/src/components/TriggerForm.tsx- 未使用
- 問題描述: 多個元件已開發但未整合進任何頁面或路由。
- 影響: 使用者無法使用留言、附件管理、觸發器設定功能
- 建議修復:
- 建立任務詳情頁面/Modal,整合 Comments 和 Attachments
- 新增 /automation 路由整合 TriggerList/TriggerForm
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 新增 TaskDetailModal.tsx 元件,整合 Comments 和 TaskAttachments,點擊任務卡片/列表項目即可開啟詳細視窗
HIGH-008: 任務指派 UI 缺失
- 類型: 功能缺失
- 模組: Frontend - Task Management
- 檔案:
frontend/src/pages/Tasks.tsx - 問題描述: 建立/編輯任務時無法選擇指派者 (assignee),無法設定時間估算。
- 影響: 核心任務管理功能不完整
- 建議修復: 在任務建立 Modal 新增指派者下拉選單和時間估算欄位
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 新增 UserSelect.tsx 元件提供使用者搜尋下拉選單,Tasks.tsx 建立任務 Modal 新增指派者、到期日、時間估算欄位,TaskDetailModal 支援編輯這些欄位
中優先問題 (Medium)
MED-001: 附件 Router 重複 Commit
- 類型: 效能問題
- 模組: Backend - Attachments
- 檔案:
backend/app/api/attachments/router.py:118-133, 178-192 - 問題描述: 同一請求中多次
db.commit(),效率低且可能導致部分交易狀態。 - 建議修復: 移除重複 commit,使用單一交易
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 移除 attachments/router.py 中 4 處重複的 db.commit() 呼叫
MED-002: 負載熱圖 N+1 查詢
- 類型: 效能問題
- 模組: Backend - Resource Management
- 檔案:
backend/app/services/workload_service.py:169-210 - 問題描述: 計算多使用者負載時,對每個使用者分別查詢任務。
- 影響: 使用者數量增加時資料庫效能下降
- 建議修復: 批次查詢所有使用者的任務,在記憶體中分組
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 重構為批次查詢所有使用者的任務,使用 defaultdict 在記憶體中分組
MED-003: datetime.utcnow() 已棄用
- 類型: 棄用警告
- 模組: Backend - Security
- 檔案:
backend/app/core/security.py:21-25 - 問題描述: 使用
datetime.utcnow()在 Python 3.12+ 已棄用。 - 建議修復:
from datetime import datetime, timezone expire = datetime.now(timezone.utc) + timedelta(...) - 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 將所有 datetime.utcnow() 改為 datetime.now(timezone.utc).replace(tzinfo=None) 以保持與 SQLite 相容性
MED-004: 錯誤回應格式不一致
- 類型: API 一致性
- 模組: Backend - API
- 檔案: 多個 endpoints
- 問題描述: 部分 endpoints 回傳
{"message": "..."}而其他回傳{"detail": "..."}。FastAPI 慣例是detail。 - 影響: 前端必須處理不一致的回應格式
- 建議修復: 統一使用
{"detail": "..."}格式 - 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 統一 attachments/router.py 和 auth/router.py 的回應格式為 {"detail": "..."}
MED-005: 阻礙狀態自動設定可能衝突
- 類型: 邏輯問題
- 模組: Backend - Tasks
- 檔案:
backend/app/api/tasks/router.py:506-511 - 問題描述: 狀態變更時自動設定
blocker_flag = False可能與 Blocker 表中未解除的阻礙記錄衝突。 - 建議修復: 根據 Blocker 表實際記錄設定 flag,而非僅依據狀態名稱
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 修改狀態變更邏輯,檢查 Blocker 表中是否有未解決的阻礙記錄來決定 blocker_flag
MED-006: 專案健康看板未實作
- 類型: 功能缺失
- 模組: Backend + Frontend - Resource Management
- 檔案: -
- 問題描述:
pjctrl_project_health表和相關 API 未實作。 - 影響: 主管無法一覽所有專案狀態
- 建議修復: 實作後端 API 和前端健康看板元件
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 實作 HealthService、health router、ProjectHealthPage 前端元件
MED-007: 容量更新 API 缺失
- 類型: 功能缺失
- 模組: Backend - Resource Management
- 檔案: -
- 問題描述: 使用者容量 (capacity) 儲存在資料庫,但無更新 API。
- 建議修復: 新增
PUT /api/users/{id}/capacityendpoint - 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 新增 PUT /api/users/{user_id}/capacity endpoint,支援權限檢查、稽核日誌、快取失效
MED-008: 排程觸發器未完整實作
- 類型: 功能缺失
- 模組: Backend - Automation
- 檔案:
backend/app/api/triggers/router.py - 問題描述: 觸發器類型驗證僅支援
field_change和schedule,但 schedule 類型的執行邏輯未完成。 - 影響: 無法使用時間條件觸發器
- 建議修復: 實作排程觸發器的 cron 解析和執行邏輯
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 實作 TriggerSchedulerService,支援 cron 表達式解析、截止日期提醒、排程任務整合
MED-009: 浮水印功能未實作
- 類型: 功能缺失
- 模組: Backend - Document Management
- 檔案:
backend/app/api/attachments/router.py - 問題描述: Spec 要求下載時自動加上使用者浮水印,但未實作 Pillow/PyPDF2 處理邏輯。
- 影響: 無法追蹤檔案洩漏來源
- 建議修復: 實作圖片和 PDF 浮水印處理函數
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 實作 WatermarkService,支援圖片和 PDF 浮水印,整合至下載流程
MED-010: useEffect 依賴缺失
- 類型: Bug
- 模組: Frontend - Multiple Components
- 檔案:
frontend/src/components/TriggerList.tsx:27-29frontend/src/components/ResourceHistory.tsx:15-17
- 問題描述:
fetchTriggers和loadHistory函數在 useEffect 中呼叫但未列為依賴。 - 影響: 可能導致閉包過期 (stale closure),ESLint 警告
- 建議修復: 使用 useCallback 包裝函數並加入依賴陣列
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 使用 useCallback 包裝 fetchTriggers 和 loadHistory 函數,並加入正確的依賴陣列
MED-011: DOM 操作在元件外執行
- 類型: 反模式
- 模組: Frontend - Attachments
- 檔案:
frontend/src/components/AttachmentUpload.tsx:185-192 - 問題描述: 在元件模組頂層建立並附加 style 元素,違反 React 生命週期管理。
- 影響: 潛在記憶體洩漏,每次 import 都會執行
- 建議修復: 將樣式移至 CSS 檔案或使用 useEffect 管理
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 將 style 元素注入邏輯移至 useEffect,並在清理時移除樣式元素
MED-012: PDF 匯出未實作
- 類型: 功能缺失
- 模組: Frontend - Audit Trail
- 檔案:
frontend/src/pages/AuditPage.tsx - 問題描述: Spec 提及 CSV/PDF 匯出,目前僅實作 CSV。
- 建議修復: 新增 PDF 匯出選項
- 狀態: [x] 已修復 (2026-01-04)
- 修復方式: 新增 Export PDF 按鈕,使用瀏覽器 window.print() 功能匯出 PDF
低優先問題 (Low)
LOW-001: 缺少完整類型提示
- 類型: 程式碼品質
- 模組: Backend - Services
- 檔案: 多個 service 檔案
- 問題描述: 部分函數缺少完整類型提示。
- 狀態: [ ] 待改善
LOW-002: 分頁無最大限制
- 類型: 效能問題
- 模組: Backend - API
- 檔案: 多個 list endpoints
- 問題描述: 雖有分頁實作,但部分 endpoints 無最大 page size 限制。
- 狀態: [ ] 待修復
LOW-003: 狀態名稱使用魔術字串
- 類型: 程式碼品質
- 模組: Backend - Reports
- 檔案:
backend/app/services/report_service.py:84-92 - 問題描述: 使用硬編碼字串比對狀態名稱
["done", "completed", "完成"]。 - 建議修復: 統一使用 TaskStatus model 的 is_done flag
- 狀態: [ ] 待改善
LOW-004: 觸發器類型驗證不完整
- 類型: 驗證不足
- 模組: Backend - Automation
- 檔案:
backend/app/api/triggers/router.py:62-66 - 問題描述: 觸發器類型僅驗證 "field_change" 和 "schedule",但 spec 提及 "creation" 類型。
- 狀態: [ ] 待修復
LOW-005: 使用 any 類型
- 類型: TypeScript 類型安全
- 模組: Frontend - Login
- 檔案:
frontend/src/pages/Login.tsx:21 - 問題描述:
catch (err: any)失去類型安全。 - 建議修復: 使用
catch (err: unknown)並進行類型守衛 - 狀態: [ ] 待改善
LOW-006: 使用原生 confirm()/alert()
- 類型: UX 一致性
- 模組: Frontend - Multiple
- 檔案:
frontend/src/components/Comments.tsx:74frontend/src/components/AttachmentList.tsx:40frontend/src/components/TriggerList.tsx:41frontend/src/components/WeeklyReportPreview.tsx:171
- 問題描述: 使用原生對話框,非無障礙且 UX 不一致。
- 建議修復: 建立可重用的確認 Modal 元件
- 狀態: [ ] 待改善
LOW-007: 錯誤處理無使用者回饋
- 類型: UX 問題
- 模組: Frontend - Spaces
- 檔案:
frontend/src/pages/Spaces.tsx:31-32 - 問題描述: 錯誤僅記錄至 console,無向使用者顯示。
- 建議修復: 新增 toast 通知系統
- 狀態: [ ] 待改善
LOW-008: 樣式方法不一致
- 類型: 程式碼一致性
- 模組: Frontend - Styling
- 檔案: 多個元件
- 問題描述: 混合使用 inline styles 物件 (Dashboard.tsx) 和類似 Tailwind 的 class 字串 (Comments.tsx)。
- 建議修復: 統一使用 CSS Modules 或 styled-components
- 狀態: [ ] 待改善
LOW-009: 缺少載入骨架
- 類型: UX 問題
- 模組: Frontend - Multiple
- 問題描述: 所有載入狀態顯示純文字 "Loading...",造成版面跳動。
- 建議修復: 新增骨架元件 (skeleton components)
- 狀態: [ ] 待改善
LOW-010: 缺少前端測試
- 類型: 測試覆蓋
- 模組: Frontend
- 問題描述: 未發現任何測試檔案。
- 建議修復: 新增 Vitest/Jest 單元測試
- 狀態: [ ] 待開發
未實作功能 (Missing Features)
| ID | 模組 | 功能 | 後端 | 前端 | 優先級 | 狀態 |
|---|---|---|---|---|---|---|
| FEAT-001 | Task Management | 自定義欄位 (Custom Fields) | 有 | 有 | 高 | ✅ 已完成 (2026-01-05) |
| FEAT-002 | Task Management | 看板視角 (Kanban View) | 有 | 有 | 高 | ✅ 已完成 (KanbanBoard.tsx) |
| FEAT-003 | Task Management | 甘特圖視角 (Gantt View) | 有 | 有 | 中 | ✅ 已完成 (2026-01-05) |
| FEAT-004 | Task Management | 行事曆視角 (Calendar View) | 有 | 有 | 中 | ✅ 已完成 (2026-01-05) |
| FEAT-005 | Task Management | 子任務建立 UI | 有 | 缺 | 中 | 待開發 |
| FEAT-006 | Task Management | 拖拉變更狀態 | 有 | 有 | 中 | ✅ 已完成 (KanbanBoard drag-drop) |
| FEAT-007 | Resource Management | 負載熱圖 UI | 有 | 有 | 高 | ✅ 已完成 (WorkloadPage.tsx) |
| FEAT-008 | Resource Management | 專案健康看板 | 有 | 有 | 中 | ✅ 已完成 (ProjectHealthPage.tsx) |
| FEAT-009 | Resource Management | 容量更新 API | 有 | N/A | 低 | ✅ 已完成 (PUT /api/users/{id}/capacity) |
| FEAT-010 | Document Management | AES-256 加密存儲 | 有 | N/A | 高 | ✅ 已完成 (2026-01-05) |
| FEAT-011 | Document Management | 動態浮水印 | 有 | N/A | 中 | ✅ 已完成 (watermark_service.py) |
| FEAT-012 | Document Management | 版本還原 UI | 有 | 缺 | 低 | 待開發 |
| FEAT-013 | Automation | 排程觸發器執行 | 有 | N/A | 中 | ✅ 已完成 (trigger_scheduler.py) |
| FEAT-014 | Automation | 更新欄位動作 | 缺 | 缺 | 低 | 待開發 |
| FEAT-015 | Automation | 自動指派動作 | 缺 | 缺 | 低 | 待開發 |
| FEAT-016 | Audit Trail | 稽核完整性驗證 UI | 有 | 缺 | 低 | 待開發 |
可訪問性問題 (Accessibility)
A11Y-001: 表單缺少 Label
- 檔案:
frontend/src/pages/Spaces.tsx:95-101 - 問題: Modal 中的 input 欄位缺少關聯的
<label>元素。 - WCAG: 1.3.1 Info and Relationships
- 狀態: [ ] 待修復
A11Y-002: 非語義化按鈕
- 檔案:
frontend/src/components/ResourceHistory.tsx:46 - 問題: 可點擊的 div 缺少 button role 或鍵盤處理。
- WCAG: 4.1.2 Name, Role, Value
- 狀態: [ ] 待修復
A11Y-003: 圖示按鈕缺少 aria-label
- 檔案:
frontend/src/pages/AuditPage.tsx:16 - 問題: 關閉按鈕 (x) 缺少 aria-label。
- WCAG: 4.1.2 Name, Role, Value
- 狀態: [ ] 待修復
A11Y-004: 顏色對比不足
- 檔案: 多個檔案
- 問題: 使用淺灰色文字 (#999, #666) 可能未達 WCAG AA 對比度標準。
- WCAG: 1.4.3 Contrast (Minimum)
- 狀態: [ ] 待檢查
A11Y-005: 缺少焦點指示器
- 檔案:
frontend/src/pages/Login.tsx - 問題: Input 樣式設定
outline: none但無自訂焦點樣式。 - WCAG: 2.4.7 Focus Visible
- 狀態: [ ] 待修復
A11Y-006: Modal 無焦點捕獲
- 檔案: 多個 Modal 元件
- 問題: Modal 未捕獲焦點,不支援 Escape 鍵關閉。
- WCAG: 2.1.2 No Keyboard Trap
- 狀態: [ ] 待修復
程式碼品質建議 (Code Quality)
後端建議
- 啟用 SQLAlchemy 嚴格模式 - 捕獲潛在的關係問題
- 新增 API 文檔測試 - 確保 OpenAPI spec 與實作一致
- 統一日誌格式 - 使用結構化日誌 (如 structlog)
- 新增健康檢查 endpoint -
/health回傳資料庫/Redis 連線狀態
前端建議
- 啟用 TypeScript 嚴格模式 -
"strict": truein tsconfig - 新增 ESLint exhaustive-deps 規則 - 防止 useEffect 依賴問題
- 建立共用元件庫 - Button, Modal, Input, Toast 等
- 實作錯誤邊界 - 防止元件錯誤影響整個應用
- 新增 i18n 支援 - 目前中英文混用
統計摘要
| 類別 | 數量 |
|---|---|
| 嚴重問題 (Critical) | 3 |
| 高優先問題 (High) | 8 |
| 中優先問題 (Medium) | 12 |
| 低優先問題 (Low) | 10 |
| 未實作功能 | 16 |
| 可訪問性問題 | 6 |
| 總計 | 55 |
修復進度追蹤
- 嚴重問題全部修復 (3/3 已完成)
- 高優先問題全部修復 (8/8 已完成)
- 中優先問題全部修復 (12/12 已完成)
- 核心功能實作完成
- 可訪問性問題修復
- 程式碼品質改善
本次修復摘要 (2026-01-04)
| Issue ID | 問題 | 狀態 |
|---|---|---|
| CRIT-001 | JWT 密鑰硬編碼 | ✅ 已修復 |
| CRIT-002 | 登入嘗試未記錄稽核日誌 | ✅ 已修復 |
| CRIT-003 | 前端 API 路徑重複 | ✅ 已修復 |
| HIGH-001 | 專案刪除使用硬刪除 | ✅ 已修復 |
| HIGH-002 | Redis Session Token 類型比對 | ✅ 已修復 |
| HIGH-003 | 無 Rate Limiting 實作 | ✅ 已修復 |
| HIGH-004 | 附件 API 缺少權限檢查 | ✅ 已修復 |
| HIGH-005 | 任務視角僅有列表視角 | ✅ 已修復 |
| HIGH-006 | 資源管理模組前端 UI | ✅ 已修復 |
| HIGH-007 | 協作/附件/觸發器元件未整合 | ✅ 已修復 |
| HIGH-008 | 任務指派 UI 缺失 | ✅ 已修復 |
| MED-001 | 附件 Router 重複 Commit | ✅ 已修復 |
| MED-002 | 負載熱圖 N+1 查詢 | ✅ 已修復 |
| MED-003 | datetime.utcnow() 已棄用 | ✅ 已修復 |
| MED-004 | 錯誤回應格式不一致 | ✅ 已修復 |
| MED-005 | 阻礙狀態自動設定可能衝突 | ✅ 已修復 |
| MED-006 | 專案健康看板 | ✅ 已修復 |
| MED-007 | 容量更新 API | ✅ 已修復 |
| MED-008 | 排程觸發器執行邏輯 | ✅ 已修復 |
| MED-009 | 浮水印功能 | ✅ 已修復 |
| MED-010 | useEffect 依賴缺失 | ✅ 已修復 |
| MED-011 | DOM 操作在元件外執行 | ✅ 已修復 |
| MED-012 | PDF 匯出未實作 | ✅ 已修復 |
後續待處理
| 類別 | 問題 | 備註 |
|---|---|---|
| LOW-001~010 | 低優先問題 | 程式碼品質改善 |
| A11Y-001~006 | 可訪問性問題 | WCAG 合規 |
QA 驗證結果
Backend QA (2026-01-04):
- CRIT-001: JWT 驗證 ✅ 正確實現
- CRIT-002: 登入審計 ✅ 完整記錄成功/失敗
- HIGH-001: 軟刪除 ✅ 正確使用 is_active 標記
- HIGH-002: Redis bytes ✅ 正確處理解碼
- HIGH-003: Rate Limiting ✅ slowapi 實作,5 req/min 限制
- HIGH-004: 權限檢查 ✅ 所有 endpoints 已驗證
- MED-006: 專案健康看板 ✅ 32 測試通過,風險評分正確
- MED-007: 容量更新 API ✅ 14 測試通過,權限和稽核正確
- MED-008: 排程觸發器 ✅ 35 測試通過,cron 和截止日期提醒正確
- MED-009: 浮水印功能 ✅ 32 測試通過,圖片和 PDF 浮水印正確
Frontend QA (2026-01-04):
- CRIT-003: API 路徑 ✅ 所有 45+ endpoints 驗證通過
- HIGH-005: Kanban 視角 ✅ 拖拉功能正常
- HIGH-007: Comments/Attachments ✅ 整合於 TaskDetailModal
- HIGH-008: 指派 UI ✅ UserSelect 元件運作正常
- MED-006: 專案健康看板 ✅ ProjectHealthPage 和 ProjectHealthCard 元件完成
OpenSpec 變更歸檔
| 日期 | 變更名稱 | 影響的 Spec |
|---|---|---|
| 2025-12-28 | add-user-auth | user-auth |
| 2025-12-28 | add-task-management | task-management |
| 2025-12-28 | add-resource-workload | resource-management |
| 2025-12-29 | add-collaboration | collaboration |
| 2025-12-29 | add-audit-trail | audit-trail |
| 2025-12-29 | add-automation | automation |
| 2025-12-29 | add-document-management | document-management |
| 2025-12-29 | fix-audit-trail | audit-trail |
| 2025-12-30 | fix-realtime-notifications | collaboration |
| 2025-12-30 | fix-weekly-report | automation |
| 2026-01-04 | add-rate-limiting | user-auth |
| 2026-01-04 | enhance-frontend-ux | task-management |
| 2026-01-04 | add-resource-management-ui | resource-management |
| 2026-01-04 | add-project-health-dashboard | resource-management |
| 2026-01-04 | add-capacity-update-api | resource-management |
| 2026-01-04 | add-schedule-triggers | automation |
| 2026-01-04 | add-watermark-feature | document-management |
| 2026-01-05 | add-kanban-realtime-sync | collaboration |
| 2026-01-05 | add-file-encryption | document-management |
| 2026-01-05 | add-gantt-view | task-management |
| 2026-01-05 | add-calendar-view | task-management |
| 2026-01-05 | add-custom-fields | task-management |
新發現問題 (New Issues)
NEW-001: 負載快取失效未在任務變更時觸發
- 類型: Bug
- 模組: Backend - Resource Management
- 檔案:
backend/app/api/tasks/router.py - 問題描述:
workload_cache.py定義了invalidate_user_workload_cache()函數,但任務指派、時間估算、狀態變更時未調用,導致負載熱圖顯示過期數據。 - 影響: 使用者變更任務後,負載熱圖不會即時反映最新分配
- 建議修復: 在
tasks/router.py的update_task、update_task_status、assign_task等 endpoints 調用invalidate_user_workload_cache() - 狀態: [x] 已修復 (2026-01-04)
- 修復內容:
- 在
create_task、update_task、update_task_status、delete_task、restore_task、assign_task端點加入invalidate_user_workload_cache()呼叫 - 同時清除
workload:heatmap:*快取確保熱圖即時更新
- 在
NEW-002: 看板缺少即時同步功能
- 類型: 功能缺失
- 模組: Frontend + Backend - Task Management
- 檔案:
backend/app/api/websocket/router.pyfrontend/src/components/KanbanBoard.tsx
- 問題描述: WebSocket 目前僅用於通知推送,看板視角沒有即時同步功能。當其他用戶拖拉任務變更狀態時,當前用戶的看板不會即時更新。
- 影響: 多人協作時可能產生狀態衝突
- 建議修復: 擴展 WebSocket 支援任務變更事件廣播,前端訂閱並即時更新看板
- 狀態: [x] 已修復 (2026-01-05)
- 修復內容:
- Backend: 新增
/ws/projects/{project_id}WebSocket endpoint - Backend: 實作 Redis Pub/Sub 任務事件廣播 (
project:{project_id}:tasks頻道) - Backend: 支援 task_created, task_updated, task_status_changed, task_deleted, task_assigned 事件
- Frontend: 新增 ProjectSyncContext 管理 WebSocket 連線
- Frontend: Tasks.tsx 整合即時更新,支援 event_id 去重、多分頁支援
- Frontend: 新增 Live/Offline 連線狀態指示器
- OpenSpec: 更新 collaboration spec 新增 Project Real-time Sync requirement
- Backend: 新增
此文件由 Claude Code 自動生成於 2026-01-04 更新於 2026-01-05