Project

General

Profile

CR #201 » CSP-002_專案骨架與模組結構.md

內容更新:內部稱謂去識別化(2026-10-18) - Redmine Admin, 10/18/2026 05:32 AM

 

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)

  1. 禁止空殼骨架:interfaces/、domain/、application/ 下不得出現「只有 class 宣告、方法本體空白」的檔案;
    骨架只包含 §3 所列之基礎設施接線(配置、健康端點、攔截器),不含業務類別佔位。
  2. 禁止 @SpringBootTest 當單元測試:單元測試不得啟動整個 Spring 容器(見 CSP-005)。
  3. 禁止跨層依賴反轉:domain/ 不得依賴 infrastructure/;依賴方向必須為
    interfaces → application → domain ← infrastructure(依賴反轉原則)。
  4. 禁止共用資料庫:各服務自有 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 落點
(33-33/67)