軟體架構 - daniel-qa/Vue GitHub Wiki
- 軟體架構 (Software Architecture) - 三層架構(3-tier)
Optimized Small Project Architecture
├─ Frontend (Vue)
│ ├─ Pages & Components
│ ├─ State Management (Vuex / provide-inject)
│ ├─ API Clients & Adapters
│ ├─ UI Flow / Routing
│ └─ View Models / UI Mapping
│
├─ Application Layer
│ ├─ Use Cases (ShareVolume, ...)
│ ├─ Conversion Services (Periods / Grades / Subjects)
│ ├─ Validation Services
│ └─ DTOs & Data Adapters (Backend ↔ Frontend)
│
├─ Backend
│ ├─ Controllers (REST API)
│ ├─ Application Services (Business Logic)
│ ├─ Domain Models (Volume / VolumeShare / School)
│ ├─ Repositories (DB Access)
│ └─ Mappers / Policies
│
└─ Data Layer
├─ Tables / Collections
├─ Relationships / Embeds
└─ Indexes / Constraints
- Mappers & Policies 在架構裡的關係
Controller → Service → (Domain Model)
│
├─ Mappers → 轉換資料格式
└─ Policies → 驗證權限 / 商業規則
Mapper = 轉換資料
Policy = 驗證規則
傳統 3-tier = 前端 / 後端 / DB
你的 4 層 = 前端 / 功能層 / 核心後端 / DB
功能層是把「後端裡面的一層」拆出來,讓專案更易維護
適合: 小團隊,一人開發,時間有限,功能不會爆炸性成長
維護週期 1~3 年的 Web App
├─ 前端層 (Frontend / Vue)
│ ├─ Page / Component 對應資料模型
│ ├─ State Management (Vuex / provide-inject)
│ └─ UI 與業務流程
│
├─ 後端層 (Backend / API / Business Logic)
│ ├─ API
│ │ ├─ find-share
│ │ ├─ get-volumeshare
│ │ ├─ set-volumeshare-source
│ │ └─ set-volumeshare-target
│ ├─ 分享流程處理 (Sharer → Target)
│ └─ 轉換表映射 (periods / grades / subjects)
│
└─ 資料層 (Database / Data Model)
├─ 核心實體 (Volume / VolumeShare / School)
├─ 關聯關係 (Volume ↔ VolumeShare / VolumeShare ↔ School)
└─ ERD / Document 結構 (NoSQL / Reference + Embed)
名詞概念
Domain Model = 「業務導向」
Entity / Object = 「程式導向」
Data Model = 「資料導向」
Domain Model = 「真實世界的東西怎麼在程式裡表達」
不管 DB 怎麼設
可以包含方法、規則、行為
Data Model = 「資料庫裡資料怎麼長」
不管程式邏輯
只管欄位、型別、索引
API 不要直接碰 DB,業務流程不要直接碰前端格式, 就已經是「小型後端乾淨架構」了
Document / NoSQL 模型
因為你是用 Cosmos DB,資料主要存成 Volume、VolumeShare 兩種 document,再用 ID 參照:
Volume = 內容主體(課綱冊)
VolumeShare = 映射/轉換表(來源 → 目標)
這種方式在 NoSQL 世界常叫:
Reference-based Document Design
或 Hybrid Document Model (Reference + Embedded Arrays)
意思是:核心資料用 reference,多對多映射用嵌入陣列。