跳至主要内容

專案初始化指南

本指南說明如何使用 app* 參考實作來初始化基於 AppFuse 框架的新專案。

適用對象

  • 準備使用 AppFuse 框架開發新應用程式的團隊
  • 想要參考花店管理系統架構來建構自己業務系統的團隊
  • 需要快速啟動專案並遵循最佳實踐的開發者

前置準備

環境需求

環境需求
前端Node.js 22.x、npm 10.x
後端Java 24+(建議使用 SDKMAN,專案已配置 .sdkmanrc
資料庫H2(開發預設)/ MySQL 8.0+ / PostgreSQL 15+
IDEVS Code + Java Extension Pack

建議的開發工具

工具用途安裝指南
git版本控制https://git-scm.com/
VS Code整合開發環境https://code.visualstudio.com/
SDKMANJava 版本管理https://sdkman.io/
VoltaNode.js 版本管理https://volta.sh/
Claude CodeAI 輔助開發https://claude.ai/claude-code
開發環境資料庫

預設使用 H2 內嵌資料庫,無需額外安裝。生產環境可切換至 MySQL、PostgreSQL 或 SQL Server。


初始化步驟

步驟 1:建立專案目錄結構

建立專案根目錄與 modules 子目錄:

mkdir -p myapp/modules
cd myapp

目標結構(以 myapp 專案為例):

myapp/                            # 專案根目錄
├── .git/ # Git repository
├── .gitignore # Git 忽略規則
├── README.md # 專案說明
└── modules/ # 模組目錄
├── .claude/ # Claude Code 設定
│ ├── rules/ # 專案開發規範
│ └── skills/ # 自動化技能
├── CLAUDE.md # Claude Code 指令
├── myapp.code-workspace # VS Code workspace
├── myapp-web-mockup/ # 前端 Prototype
├── myapp-web/ # 前端 SPA
├── myapp-server/ # 後端 API
└── ... # 其他模組

步驟 2:初始化開發環境配置

從參考實作複製開發環境配置檔:

Git 配置

# 複製 .gitignore
cp /path/to/appfuse-webapp-v1/.gitignore myapp/

# 初始化 Git repository
cd myapp
git init

VS Code Workspace

複製並修改 workspace 檔案:

cp /path/to/appfuse-webapp-v1/modules/appfuse-webapp.code-workspace \
myapp/modules/myapp.code-workspace

修改 myapp.code-workspace

  • 更新 folders 陣列,列出您的模組
  • 保留 settings 中的 Java 配置

Claude Code 配置

# 複製 CLAUDE.md 與 .claude 目錄
cp /path/to/appfuse-webapp-v1/modules/CLAUDE.md myapp/modules/
cp -r /path/to/appfuse-webapp-v1/modules/.claude myapp/modules/

包含的配置:

目錄/檔案說明
CLAUDE.mdClaude Code 專案指令
.claude/rules/專案開發規範(語言、commit、架構等)
.claude/skills/自動化技能(升級框架、發布等)
調整 Claude 規則

複製後請檢視 .claude/rules/ 中的規則,根據團隊需求調整。

步驟 3:複製參考實作模組

根據當前階段需求選擇要複製的模組。不需要一次初始化所有模組,可在日後根據需要再初始化其他模組。

模組用途初始化時機
app-web-mockup前端 Prototype(Mock API)⭐ Prototype 階段
app-web前端 SPA 生產版生產開發階段
app-server後端 RESTful API生產開發階段
app-web-host前端 WAR 託管準備部署時
app-docs應用文檔站需要文檔時
app-docs-host文檔 WAR 託管準備部署文檔時
漸進式初始化

建議從 Prototype 開始,待需求確認後,再初始化生產模組。

模組命名

模組名稱可自由命名。基本對應:

參考實作初始化為
app-web-mockupmyapp-web-mockup
app-webmyapp-web
app-servermyapp-server
app-web-hostmyapp-web-host
app-docsmyapp-docs

複製範例

cd myapp/modules

# Prototype 階段
cp -r /path/to/appfuse-webapp-v1/modules/app-web-mockup myapp-web-mockup

# 生產階段
cp -r /path/to/appfuse-webapp-v1/modules/app-web myapp-web
cp -r /path/to/appfuse-webapp-v1/modules/app-server myapp-server

# 準備部署時再初始化
cp -r /path/to/appfuse-webapp-v1/modules/app-web-host myapp-web-host

# 需要文檔時再初始化
cp -r /path/to/appfuse-webapp-v1/modules/app-docs myapp-docs
進階:前後台分離

同一參考實作可初始化多個模組。例如需要前後台分離時:

參考實作初始化為用途
app-webmyapp-office後台管理系統
app-webmyapp-portal前台網站
app-servermyapp-server共用後端 API

步驟 4:更新專案識別

VS Code Workspace

更新 workspace 檔名與 folders,列出已初始化的模組:

// myapp.code-workspace
{
"folders": [
{ "path": "myapp-web-mockup" },
{ "path": "myapp-web" },
{ "path": "myapp-server" }
// 日後初始化其他模組時再加入
],
"settings": {
// 保留原有設定
}
}
漸進式更新

每次初始化新模組後,記得將其加入 VS Code workspace。

前端模組 (package.json)

{
"name": "@myteam/myproject-web",
"description": "My Project 前端應用",
"volta": {
"node": "22.19.0"
}
}

後端模組

settings.gradle.kts

rootProject.name = "myproject-server"

build.gradle.kts

group = "com.mycompany.myproject"

Java package 路徑

  • io.leandev.app 重新命名為 com.mycompany.myproject

SDKMAN 配置 (.sdkmanrc)

各後端模組已包含 .sdkmanrc,確認 Java 版本:

# .sdkmanrc
java=24.0.1-tem

步驟 5:配置框架依賴

前端 (.npmrc)

在各前端模組根目錄建立 .npmrc

@appfuse:registry=https://devops.leandev.io/repository/npm-releases/

後端

Gradle repository 已在 build.gradle.kts 中預設配置,無需額外設定。

步驟 6:參考實作程式碼處理

保留花店管理系統程式碼供團隊參考

參考實作中包含完整的「花店管理系統」業務邏輯,涵蓋:

前端

  • src/applets/ - 業務模組(產品、訂單、客戶管理)
  • src/services/ - API 服務層
  • src/mocks/ - Mock API handlers 與種子數據
  • src/features/ - Redux slices

後端

  • entity/ - JPA 實體
  • controller/ - REST API 端點
  • service/ - 業務邏輯層
  • repository/ - 資料存取層
保留供參考

建議在初始化階段保留這些程式碼,團隊可參考實作方式,自行決定移除時機。

步驟 7:驗證開發環境

使用 VS Code Workspace 開啟專案

code myapp/modules/myapp.code-workspace

啟動前端 Prototype

cd myapp/modules/myapp-web-mockup
npm install
npm run dev
# 開啟 http://localhost:3001

啟動後端

cd myapp/modules/myapp-server
./gradlew bootRun
# API 位於 http://localhost:8080/myapp-server
伺服器端口

開發流程

獨立發展

初始化後,團隊的專案模組即為獨立程式碼,不再與參考實作同步。框架更新透過 npm / Gradle 取得。

Prototype → 生產流程

Mock → 真實 API 漸進切換

app-web 透過 config.app.msw.enabled 控制 MSW:

環境MSW 狀態說明
開發環境(npm run dev自動啟用所有 API 由 MSW 處理
生產環境(npm run build預設關閉所有 API 連接真實後端

混合模式:MSW 設定 onUnhandledRequest: 'bypass',未匹配的請求自動轉發到真實後端。移除對應的 handler 即可切換到真實 API。

詳細說明請參閱「Mock → 真實 API 漸進切換


必讀文檔索引

按優先級閱讀:

優先級文檔說明
🔴 P0快速開始環境設定與啟動步驟
🔴 P0專案程式結構程式碼組織與各層職責
🟠 P1系統架構整體架構說明
🟠 P1開發流程指南完整 SCRUM 流程
🟡 P2貢獻指南開發規範與 Code Review
🟡 P2規格撰寫指南Epic、User Story、SBE 撰寫規範

框架使用指南

文檔說明
AppFuse Web 指南React 框架使用指南
AppFuse Server 指南Spring 框架使用指南

常見問題 (FAQ)

Q: 可以只用前端,不用後端嗎?

A: 僅限 Prototype 階段可以。複製 app-web-mockup 使用 Mock API 即可。適合:

  • 設計驗證與原型展示
  • 與利害關係人確認需求
  • 前端開發先行,後端稍後加入
生產環境

若要部署到生產環境,必須使用完整架構:app-web + app-server + app-web-host

  • app-server:提供真實 API 與資料持久化
  • app-web-host:將 SPA 封裝成 WAR 部署到 Java Application Server

Q: app-web 與 app-web-mockup 的差異?

A: 程式碼幾乎完全相同,主要差異在環境變數:

  • app-web-mockup:強制使用 Mock API
  • app-web:支援 Mock → 真實 API 漸進切換

Q: 如何測試未發布的框架變更?

A: 使用 yalc 工作流程:

# 1. 在框架專案發布到本地
cd appfuse-web
npm run build && yalc publish

# 2. 在應用專案使用本地框架
cd my-app
yalc add @appfuse/appfuse-web
npm install

詳見 yalc 工作流程

Q: 初始化後還會與參考實作同步嗎?

A: 不會。初始化後,團隊的專案模組就獨立發展,不再與參考實作(app-*)同步。

  • 框架更新:透過 npm / Gradle 持續取得 appfuse-web / appfuse-server 框架更新
  • 參考實作:僅作為初始化起點,複製後即為團隊獨立的程式碼

Q: 多租戶架構如何運作?

A: 後端使用 Hibernate Filter 自動過濾租戶資料:

  • Entity 繼承 AuditableTenantEntity
  • Repository 繼承 TenantAwareRepository
  • 無需手動撰寫 WHERE tenant_id = ? 條件

詳見 app-server 的 docs/design-guidelines/multi-tenancy.md

Q: 花店管理系統的程式碼何時移除?

A: 由開發團隊自行決定。建議:

  1. 先熟悉參考實作的程式碼結構與實作方式
  2. 開發新業務功能時參考對應的實作
  3. 當團隊對架構足夠熟悉後,再逐步移除不需要的程式碼

自動化工具

專案初始化使用兩個 Claude Code Skill:骨架建立(一次)+ 模組新增(多次)。

/scaffold-project — 建立專案骨架

在 appfuse 框架工作目錄執行,建立新專案的目錄結構與配置。

/scaffold-project                           # 互動式詢問所有參數
/scaffold-project myapp # 指定專案名稱
/scaffold-project myapp /path/to/myapp # 指定專案名稱與目標目錄

功能:

  • 收集專案名稱、目標目錄、npm scope
  • 複製開發環境配置(.gitignore, CLAUDE.md, .claude/, workspace)
  • 建立 project.json(記錄專案設定,供 /add-module 使用)
  • 不複製模組(交給 /add-module

/add-module — 增量新增模組

在新專案 modules/ 目錄執行,從參考實作複製模組並套用識別。

/add-module                    # 互動式選擇模組
/add-module web-mockup # 直接指定模組代號

支援的模組代號:

代號參考實作階段
web-mockupapp-web-mockup提案
docsapp-docs提案
serverapp-server成案
webapp-web成案
web-hostapp-web-host部署
docs-hostapp-docs-host部署

功能:

  • 從參考實作複製並重命名模組
  • 套用識別(npm scope、Gradle group、Java package)
  • 延遲收集:Gradle group 等後端識別在首次需要時才詢問
  • 更新 workspace、README.md、project.json
  • 驗證建構(npm run build / gradlew compileJava)

下一步

完成專案初始化後,建議:

  1. 閱讀程式結構專案程式結構
  2. 了解系統架構系統架構
  3. 參考花店系統:研究現有 applets 的實作方式
  4. 開始開發:根據業務需求新增 applets
  5. 撰寫規格:使用 app-docs 記錄需求和設計