Files
hr-position-system/SDD_代碼分離優化.md
DonaldFang 方士碩 a6af297623 backup: 完成 HR_position_ 表格前綴重命名與欄位對照表整理
變更內容:
- 所有資料表加上 HR_position_ 前綴
- 整理完整欄位顯示名稱與 ID 對照表
- 模組化 JS 檔案 (admin.js, ai.js, csv.js 等)
- 專案結構優化 (docs/, scripts/, tests/ 等)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 12:05:20 +08:00

559 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 軟體設計文件 (SDD) - 代碼分離優化
### 📁 推薦的最終檔案結構
```
d:\00001_Vibe_coding\1204剛為\
├── index.html (僅 HTML 結構,約 1,500 行)
├── login.html (僅 HTML 結構,約 200 行)
├── styles/ (CSS 樣式)
│ ├── base.css (基礎樣式、變數、Reset)
│ ├── layout.css (整體布局)
│ ├── components.css (按鈕、表單、卡片元件)
│ ├── modules.css (5 個頁籤的專屬樣式)
│ ├── utilities.css (工具類別)
│ └── login.css (登入頁專屬樣式)
├── js/ (JavaScript 程式碼)
│ ├── config.js (設定API URL、常數)
│ ├── utils.js (工具函式)
│ ├── api.js (API 呼叫)
│ ├── ui.js (UI 操作)
│ ├── form-handlers.js (表單處理)
│ ├── ai-generators.js (AI 生成函式)
│ ├── dropdown.js (下拉選單邏輯)
│ ├── validators.js (表單驗證)
│ └── main.js (主程式、初始化)
├── data/ (資料檔案 - 已存在)
│ ├── hierarchical_data.js ✅ 已存在
│ └── dropdown_data.js ✅ 已存在
├── docs/ (文件)
│ ├── prompt.md ✅ 已存在
│ ├── 權限矩陣.md ✅ 已存在
│ └── SDD_代碼分離優化.md (本文件)
├── app.py ✅ 後端程式
├── .env ✅ 環境設定
├── .gitignore
└── README.md
```
---
## 分離策略
### 📝 CSS 分離策略詳解
#### 1. base.css - 基礎樣式(約 150 行)
```css
/**
* CSS Variables - 主題色、間距、字體
* CSS Reset - Normalize.css
* 全域樣式 - body, html, *
*/
```
**包含內容**:
- CSS 變數定義(顏色、間距、字體、陰影等)
- CSS Reset統一瀏覽器預設樣式
- 全域樣式body、html、通用選擇器
---
#### 2. layout.css - 布局樣式(約 100 行)
```css
/**
* Container - 容器
* Grid System - 網格系統
* Flexbox Layout - 彈性布局
* Header/Footer - 頁首頁尾
*/
```
**包含內容**:
- `.container``.main-content`
- Grid 和 Flexbox 布局類別
- 頁面整體結構header、footer、sidebar
---
#### 3. components.css - 元件樣式(約 250 行)
```css
/**
* Buttons - 按鈕(.btn-primary, .ai-generate-btn
* Forms - 表單(.form-group, input, select, textarea
* Cards - 卡片(.info-card, .module-card
* Tabs - 頁籤(.tab-nav, .tab-panel
* Modals - 彈窗
* Toast - 提示訊息
*/
```
**包含內容**:
- 可重用的 UI 元件
- 按鈕樣式(各種變體)
- 表單元件input、select、textarea、checkbox
- 卡片、頁籤、彈窗等元件
---
#### 4. modules.css - 模組樣式(約 150 行)
```css
/**
* Position Basic - 崗位基礎資料模組
* Position Recruit - 崗位招聘要求模組
* Job Basic - 職務基礎資料模組
* Dept Function - 部門職責維護模組
* Job Desc - 崗位描述模組
* Position List - 崗位清單模組
*/
```
**包含內容**:
- 各頁籤的專屬樣式
- 特殊布局需求
- 模組內的特殊元件
---
#### 5. utilities.css - 工具類別(約 50 行)
```css
/**
* Spacing - 間距m-1, p-2
* Text - 文字text-center, text-bold
* Display - 顯示d-none, d-block
* Colors - 顏色text-primary, bg-success
* Responsive - 響應式(@media
*/
```
**包含內容**:
- 快速工具類別
- 響應式斷點
- 常用的單一用途類別
---
### 💻 JavaScript 分離策略詳解
#### 1. config.js - 設定檔(約 50 行)
```javascript
/**
* API 端點設定
* 常數定義
* 環境設定
*/
export const API_BASE_URL = 'http://127.0.0.1:5000/api';
export const TOAST_DURATION = 3000;
export const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
```
---
#### 2. utils.js - 工具函式(約 200 行)
```javascript
/**
* showToast() - 顯示提示訊息
* fillIfEmpty() - 填充空白欄位
* getFieldValue() - 取得欄位值
* setButtonLoading() - 設定按鈕載入狀態
* formatDate() - 日期格式化
* debounce() - 防抖函式
*/
export function showToast(message, type = 'info') { ... }
export function fillIfEmpty(fieldId, value) { ... }
```
---
#### 3. api.js - API 呼叫(約 150 行)
```javascript
/**
* callClaudeAPI() - 呼叫 LLM API
* fetchPositions() - 取得崗位清單
* createPosition() - 建立崗位
* updatePosition() - 更新崗位
* deletePosition() - 刪除崗位
*/
export async function callClaudeAPI(prompt) { ... }
export async function fetchPositions() { ... }
```
---
#### 4. ui.js - UI 操作(約 300 行)
```javascript
/**
* switchModule() - 切換模組
* updatePreview() - 更新預覽
* showModal() - 顯示彈窗
* hideModal() - 隱藏彈窗
* renderPositionList() - 渲染崗位清單
*/
export function switchModule(moduleName) { ... }
export function updatePreview() { ... }
```
---
#### 5. form-handlers.js - 表單處理(約 400 行)
```javascript
/**
* validatePositionForm() - 驗證崗位表單
* submitPositionForm() - 提交崗位表單
* clearForm() - 清除表單
* saveToPositionList() - 儲存至崗位清單
*/
export function validatePositionForm() { ... }
export async function submitPositionForm() { ... }
```
---
#### 6. ai-generators.js - AI 生成(約 500 行)
```javascript
/**
* generatePositionBasic() - 生成崗位基礎資料
* generatePositionRecruit() - 生成崗位招聘要求
* generateJobBasic() - 生成職務基礎資料
* generateDeptFunction() - 生成部門職責
* generateJobDesc() - 生成崗位描述
*/
export async function generatePositionBasic() { ... }
export async function generatePositionRecruit() { ... }
```
---
#### 7. dropdown.js - 下拉選單(約 300 行)
```javascript
/**
* initializeDropdowns() - 初始化下拉選單
* onBusinessUnitChange() - 事業體改變處理
* onDivisionChange() - 處級單位改變處理
* onDepartmentChange() - 部級單位改變處理
* updatePositionDropdown() - 更新崗位下拉選單
*/
export function initializeDropdowns() { ... }
export function onBusinessUnitChange(event) { ... }
```
---
#### 8. validators.js - 表單驗證(約 200 行)
```javascript
/**
* validateRequired() - 驗證必填欄位
* validateEmail() - 驗證電子郵件
* validateDate() - 驗證日期格式
* validateNumber() - 驗證數字範圍
*/
export function validateRequired(value) { ... }
export function validateEmail(email) { ... }
```
---
#### 9. main.js - 主程式(約 150 行)
```javascript
/**
* 初始化應用程式
* 設定事件監聽器
* 載入使用者資訊
* 啟動應用
*/
import { initializeDropdowns } from './dropdown.js';
import { loadUserInfo } from './ui.js';
import { API_BASE_URL } from './config.js';
document.addEventListener('DOMContentLoaded', () => {
loadUserInfo();
initializeDropdowns();
// ... 其他初始化邏輯
});
```
---
## 風險評估
### ⚠️ 潛在風險與對策
| 風險項目 | 風險等級 | 影響範圍 | 對策 |
|---------|---------|---------|------|
| **載入順序錯誤** | 🔴 高 | 功能失效 | 使用 ES6 Modules 自動處理依賴 |
| **全域變數衝突** | 🟡 中 | 部分功能異常 | 使用模組化,避免全域污染 |
| **快取問題** | 🟡 中 | 更新未生效 | 使用版本號 `?v=1.0.0` |
| **路徑錯誤** | 🟢 低 | 載入失敗 | 使用相對路徑,充分測試 |
| **效能下降** | 🟢 低 | 載入變慢 | HTTP/2 多路復用,瀏覽器快取 |
| **回滾困難** | 🟡 中 | 無法還原 | 分階段執行,每階段 Git commit |
---
## 執行計畫
### 📅 分階段執行時程(選項 B
#### 階段 1⃣: CSS 分離(預估 1-2 天)
**Day 1 上午**: CSS 檔案建立
- [ ] 建立 `styles/` 目錄
- [ ] 建立 `base.css`CSS 變數、Reset
- [ ] 建立 `layout.css`(布局)
- [ ] 建立 `components.css`(元件)
- [ ] 建立 `modules.css`(模組)
- [ ] 建立 `utilities.css`(工具)
**Day 1 下午**: CSS 程式碼搬移
- [ ] 從 index.html 複製 CSS 到對應檔案
- [ ] 轉換硬編碼顏色為 CSS 變數
- [ ] 在 index.html 引入 CSS 檔案
**Day 2 上午**: CSS 測試
- [ ] 測試各頁籤樣式正確性
- [ ] 測試響應式布局
- [ ] 測試按鈕、表單、卡片元件
- [ ] 修正樣式問題
**Day 2 下午**: CSS 優化與提交
- [ ] 檢查是否有重複樣式
- [ ] 優化選擇器效能
- [ ] Git commit: "refactor: separate CSS from index.html"
---
#### 階段 2⃣: JavaScript 工具函式分離(預估 1-2 天)
**Day 3 上午**: 建立核心模組
- [ ] 建立 `js/` 目錄
- [ ] 建立 `config.js`(設定)
- [ ] 建立 `utils.js`(工具函式)
- [ ] 建立 `api.js`API 呼叫)
**Day 3 下午**: 搬移工具函式
- [ ] 搬移 `showToast()`
- [ ] 搬移 `fillIfEmpty()`
- [ ] 搬移 `getFieldValue()`
- [ ] 搬移 `setButtonLoading()`
- [ ] 搬移 `callClaudeAPI()`
**Day 4 上午**: 測試核心功能
- [ ] 測試 Toast 提示
- [ ] 測試 API 呼叫
- [ ] 測試欄位填充
- [ ] 測試按鈕載入狀態
**Day 4 下午**: 提交
- [ ] Git commit: "refactor: separate utils and api modules"
---
#### 階段 3⃣: JavaScript 模組分離(預估 2-3 天)
**Day 5**: UI 與表單處理
- [ ] 建立 `ui.js`
- [ ] 建立 `form-handlers.js`
- [ ] 建立 `validators.js`
- [ ] 搬移相關函式
- [ ] 測試表單功能
- [ ] Git commit
**Day 6**: AI 生成與下拉選單
- [ ] 建立 `ai-generators.js`
- [ ] 建立 `dropdown.js`
- [ ] 搬移 5 個 AI 生成函式
- [ ] 搬移下拉選單邏輯
- [ ] 測試 AI 生成功能
- [ ] 測試階層式下拉選單
- [ ] Git commit
**Day 7**: 主程式整合
- [ ] 建立 `main.js`
- [ ] 設定模組匯入
- [ ] 整合所有模組
- [ ] 完整功能測試
- [ ] Git commit
---
#### 階段 4⃣: 優化與收尾(預估 1 天)
**Day 8 上午**: 程式碼審查
- [ ] 檢查模組依賴關係
- [ ] 檢查是否有遺漏的函式
- [ ] 檢查命名一致性
- [ ] 檢查註解文件
**Day 8 下午**: 效能測試與文件
- [ ] 測試頁面載入速度
- [ ] 測試瀏覽器快取
- [ ] 更新 README.md
- [ ] 更新開發文件
- [ ] Git commit: "docs: update documentation for refactored code"
---
### 🔄 每日檢查清單
**每天開發前**:
- [ ] 拉取最新程式碼 `git pull`
- [ ] 建立功能分支(如有需要)
- [ ] 備份當前版本
**每天開發後**:
- [ ] 執行完整測試
- [ ] Commit 當日進度
- [ ] 更新進度表
- [ ] 記錄遇到的問題
---
## 驗收標準
### ✅ 功能驗收清單
#### 1. CSS 分離驗收
- [ ] 所有頁籤樣式正確顯示
- [ ] 按鈕顏色與漸層正確
- [ ] 表單元件樣式一致
- [ ] 響應式布局正常
- [ ] 沒有樣式閃爍FOUC
- [ ] 瀏覽器開發者工具無 CSS 錯誤
#### 2. JavaScript 分離驗收
- [ ] 所有頁籤功能正常
- [ ] AI 生成功能正常
- [ ] 表單驗證正常
- [ ] 下拉選單連動正常
- [ ] Toast 提示顯示正常
- [ ] API 呼叫正常
- [ ] 瀏覽器 Console 無錯誤
#### 3. 效能驗收
- [ ] 首次載入時間 ≤ 3 秒
- [ ] 後續載入時間 ≤ 1 秒(快取生效)
- [ ] 無記憶體洩漏
- [ ] CPU 使用率正常
#### 4. 相容性驗收
- [ ] Chrome 最新版正常
- [ ] Firefox 最新版正常
- [ ] Safari 最新版正常(如需支援)
- [ ] Edge 最新版正常
#### 5. 程式碼品質驗收
- [ ] 檔案結構清晰
- [ ] 命名規範一致
- [ ] 註解完整
- [ ] 無重複程式碼
- [ ] 模組依賴清晰
---
### 📊 效能指標
| 指標項目 | 當前值 | 目標值 | 驗收標準 |
|---------|--------|--------|---------|
| **首次載入時間** | ~2.5s | ≤ 3s | ✅ 通過 |
| **快取載入時間** | N/A | ≤ 1s | 待測試 |
| **CSS 檔案大小** | 內嵌 | ≤ 100KB | 待測試 |
| **JS 檔案大小** | 內嵌 | ≤ 300KB | 待測試 |
| **HTTP 請求數** | 3-5 個 | ≤ 15 個 | 待測試 |
---
## 附錄
### 📚 參考資源
#### 技術文件
- [ES6 Modules - MDN](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Modules)
- [CSS Variables - MDN](https://developer.mozilla.org/zh-TW/docs/Web/CSS/Using_CSS_custom_properties)
- [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript)
#### 最佳實踐
- [Google HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssguide.html)
- [Clean Code JavaScript](https://github.com/ryanmcdermott/clean-code-javascript)
---
### 🔧 開發工具建議
#### HTTP Server本地開發
如果選擇 ES6 Modules需要使用 HTTP Server
**選項 1: Python HTTP Server**
```bash
cd d:\00001_Vibe_coding\1204剛為
python -m http.server 8000
# 瀏覽器開啟: http://localhost:8000
```
**選項 2: Live ServerVS Code 套件)**
- 安裝 VS Code 套件「Live Server」
- 右鍵點擊 index.html → "Open with Live Server"
**選項 3: Node.js http-server**
```bash
npm install -g http-server
cd d:\00001_Vibe_coding\1204剛為
http-server -p 8000
```
---
### 📝 Git Commit 規範建議
```
feat: 新功能
fix: 修復 Bug
refactor: 重構(不影響功能)
style: 樣式調整(不影響程式邏輯)
docs: 文件更新
test: 測試相關
chore: 建構工具或輔助工具變動
```
**範例**:
```bash
git commit -m "refactor: separate CSS into modular files"
git commit -m "refactor: extract utils and api modules"
git commit -m "docs: update SDD with final architecture"
```
---
## 決策回覆表單
請將您的決策填寫在下方,我會根據您的選擇提供對應的實作方案:
```
=== 決策回覆表單 ===
決策 1 (CSS 分離策略): [ ]
決策 2 (JavaScript 分離策略): [ ]
決策 3 (模組載入方式): [ ]
決策 4 (共用樣式處理): [ ]
決策 5 (CSS 變數與主題): [ ]
決策 6 (執行順序): [ ]
決策 7 (命名規範): [ ]
決策 8 (瀏覽器相容性): [ ]
其他需求或建議:
_____________________________________
_____________________________________
_____________________________________
=== 表單結束 ===
```
---
**文件狀態**: 📋 等待決策
**下一步**: 請您填寫決策後,我將提供詳細的實作步驟與程式碼範例
---
> **提醒**: 此 SDD 文件會隨著專案進展持續更新。如有任何疑問或需要調整,歡迎隨時討論。
>
> ¯\\_(ツ)_/¯ 那都AI寫的不要問我