CR #201 » CSP-002_專案骨架與模組結構.md
CSP-002 專案骨架與模組結構(Project Skeleton & Module Structure)
| 項目 | 內容 |
|---|---|
| 文件編號 | CSP-002 |
| 版本 | 1.1 |
| 狀態 | 已核定 |
| 撰寫者 | SA / Tech Lead |
| 審查者 | PMO |
| 對應需求 | BRD-001 §5 系統邊界;SAD-002 微服務劃分 |
1. 目的
定義微服務程式碼倉(repository)的標準骨架:目錄布局、建置設定、共用程式庫、跨服務契約,
使 17 個服務(SAD-002)具備一致、可獨立建置、可獨立部署的結構。
骨架僅提供結構與必要基礎設施接線(如配置類、健康檢查端點),不含任何業務邏輯空殼(見 §6 禁止事項)。
2. 倉庫策略
建議採 「一個服務一個倉庫」(one-service-one-repo),便於獨立 CI/CD 與權限隔離;
共用程式庫獨立為 cardcore-common 系列模組,經套件管理發佈。
cardcore/
├── backend/
│ ├── services/
│ │ ├── authorization-service/ 授權(iECS 授權引擎)
│ │ ├── card-service/ 卡片生命週期
│ │ ├── limit-service/ 額度管理
│ │ ├── party-service/ 歸戶/卡人(多層次帳戶歸戶層)
│ │ ├── product-service/ 產品參數化(P0–P3)
│ │ ├── pricing-service/ 費率/利息
│ │ ├── posting-service/ 入帳/分戶(CQRS 寫側)
│ │ ├── payment-service/ 繳款/約定扣款
│ │ ├── installment-service/ 分期
│ │ ├── rewards-service/ 點數累積/兌換
│ │ ├── statement-service/ 帳單
│ │ ├── dispute-service/ 爭議帳款
│ │ ├── clearing-service/ 清算結算
│ │ ├── merchant-service/ 特約商店/收單
│ │ ├── migration-service/ 遷移波次(W0–W4)與回退
│ │ ├── notification-service/ 通知
│ │ └── report-service/ 報表
│ └── platform/
│ ├── api-gateway/ 統一入口、路由、限流
│ ├── bff-web/ Web 聚合層(前端 BFF)
│ ├── common-spring/ 跨服務 Spring 基礎(例外、攔截器、追蹤)
│ ├── common-security/ 鑑權、加解密、個資遮蔽
│ ├── common-event/ Kafka 事件基底、Outbox 工具
│ └── common-domain/ 共用值物件(Money、CardNumber…)
└── frontend/
└── cardcore-web/ React 18 + Vite + TypeScript 單體前端
3. 單一服務骨架(Gradle 基線)
語言為 Java 21(見
CSP-006 §2.1)。原 1.0 版誤植為 Kotlin,已更正。
authorization-service/
├── build.gradle.kts 依賴與外掛(Spring Boot、Jacoco、SpotBugs)
├── settings.gradle.kts
├── Dockerfile 多階段建置(JRE 執行期)
├── src/main/
│ ├── java/com/beam/cardcore/auth/
│ │ ├── interfaces/rest/ AuthorizationController + DTO
│ │ ├── application/command/ AuthorizeTransactionHandler
│ │ ├── application/query/ GetAuthorizationHandler
│ │ ├── application/port/ AuthorizationRepositoryPort
│ │ ├── domain/model/ Authorization(聚合根)
│ │ ├── domain/service/ LimitCheckService
│ │ └── infrastructure/persistence/ OracleAuthorizationAdapter
│ └── resources/
│ ├── application.yml 連線、逾時、開關(來自 Config Server)
│ └── db/migration/ Flyway:V1__init.sql 等(Oracle 方言)
└── src/test/java/... 單元/整合測試(CSP-005)
骨架約定:每個服務暴露 GET /actuator/health(liveness/readiness)、
GET /actuator/info(版本、commit)、GET /actuator/prometheus(指標)。
骨架產生:17 個服務之骨架由 tools/gen_service_skeleton.py 依 CSP-007 產生,
不得手工複製貼上(避免骨架漂移)。
4. 共用程式庫職責
| 模組 | 職責 | 禁止放入 |
|---|---|---|
common-spring |
全域例外攔截器、相關性 ID(correlation-id)過濾器、統一回應封套 | 業務規則 |
common-security |
JWT 驗證、欄位級加解密、個資遮蔽工具(對應 SAD-005) | 特定服務邏輯 |
common-event |
事件基類、Outbox 表 DDL、發布器 | 領域事件內容 |
common-domain |
Money、CardNumber、LimitAmount、Currency 等值物件 |
可變狀態 |
5. 跨服務契約綁定
-
API 契約:每個服務的 REST 介面必須與
cardcore/contracts/openapi/<service>.yaml(SDD-006)一致;
CI 以openapi-diff比對實作與契約,不允許「實作漂移」。 -
事件契約:領域事件結構定義於
common-event,版本以schema_version欄位向後相容演進。 -
DB 遷移:Flyway 腳本須可重跑(冪等);禁止在生產腳本使用
DROP TABLE或DELETE全表。
6. 禁止事項(對應 CSP-001 §8)
-
禁止空殼骨架:
interfaces/、domain/、application/下不得出現「只有class宣告、方法本體空白」的檔案;
骨架只包含 §3 所列之基礎設施接線(配置、健康端點、攔截器),不含業務類別佔位。 -
禁止
@SpringBootTest當單元測試:單元測試不得啟動整個 Spring 容器(見 CSP-005)。 -
禁止跨層依賴反轉:
domain/不得依賴infrastructure/;依賴方向必須為
interfaces → application → domain ← infrastructure(依賴反轉原則)。 -
禁止共用資料庫:各服務自有 schema(SAD-003),禁止跨服務直連他庫。
權威 OLTP schema 位於 Oracle(CC_<SERVICE>);CQRS 讀模型/事件流存檔/報表位於
PostgreSQL(proj/evt/rpt),詳見CSP-006 §2.4。
flowchart TD
A[interfaces] --> B[application]
B --> C[domain]
D[infrastructure] -.implements port.-> B
D -.reads/writes.-> E[(schema: auth)]
C -.defines port.-> B
style C fill:#EEF3F8,stroke:#0B2E59
style E fill:#FFF6E0,stroke:#C8A45C
7. 前端骨架(React 18 + Vite)
cardcore-web/
├── package.json React 18 / Vite / TypeScript / ESLint
├── src/
│ ├── app/ 路由、佈局、Provider
│ ├── features/ 依業務功能切分(auth, card, limit, party…)
│ │ └── <feature>/ components / hooks / api / types
│ ├── shared/ UI 元件庫、HTTP client、錯誤處理
│ └── mocks/ 開發期假資料(**僅 dev 模式載入,不進 production bundle**)
└── vite.config.ts proxy 指向 api-gateway / bff-web
關鍵:客戶認可之
bank-core-react-standalone 1.html為設計參考(選單、版面、元件),
前端須依 SDD-007 重構為接真 API 的 React 元件;src/mocks/僅於import.meta.env.DEV啟用,
正式建置不得包含任何 mock 資料路徑(CI 以grep確認 production bundle 無mock引用)。
8. 修訂記錄
| 版本 | 日期 | 修訂者 | 說明 |
|---|---|---|---|
| 1.0 | 2026-09-17 | SA / Tech Lead | 初版 |
| 1.1 | 2026-09-18 | SA / Tech Lead | ①§3 骨架路徑 src/main/kotlin/、src/test/kotlin/ 更正為 src/main/java/、src/test/java/——原路徑與 CSP-001 §5 指定之 Java 工具鏈(Checkstyle/SpotBugs/PMD)矛盾,經決議採 Java 21(CSP-006 §2.1);②§3 持久化實作 PostgresAuthorizationAdapter 更名為 OracleAuthorizationAdapter——權威 OLTP 已改為 Oracle(CSP-006 §2.4);③§3 增列骨架產生器 tools/gen_service_skeleton.py 與規範 CSP-007;④§6.4 補充 Oracle/PostgreSQL 之 schema 落點 |