這是一個基於 Spring Boot 3.3 和 Java 21 的後端作業專案,包含 OCPI 互動流程圖設計與 RESTful API 實作。
- Java Version: 21 (LTS)
- Framework: Spring Boot 3.3.5
- Database: H2 In-Memory Database (開發測試用)
- Build Tool: Maven (包含 Maven Wrapper)
- API Documentation: Swagger UI / OpenAPI 3
- Security: BCrypt Password Hashing
- Email Services: 支援 Mock (預設), Mailjet, Brevo
- JDK 21+
- Maven 3.8+ (或直接使用專案內建的
./mvnw)
本專案提供 Makefile 以簡化常用指令:
# 顯示說明與連結
make info
# 啟動應用程式 (預設 Port: 8080)
make run
# 執行所有測試 (單元測試 + 整合測試)
make test
# 清理並建置專案
make build
# Docker 部署
make docker-build # 建置 Docker Image
make docker-run # 啟動 Docker 容器 (背景執行)
make docker-stop # 停止 Docker 容器若無法使用 Make,可使用 Maven Wrapper:
# 啟動
./mvnw spring-boot:run
# 執行測試
./mvnw test專案支援讀取 .env 檔案來設定敏感資訊。請複製範例檔案並修改:
cp .env.example .env本專案支援多種 Email 發送模式,可於 application.yml 或 .env 中切換:
- Mock 模式 (預設): 不會真正發信,僅在 Log 顯示內容。
- 設定:
EMAIL_PROVIDER=mock
- 設定:
- Mailjet:
- 設定:
EMAIL_PROVIDER=mailjet - 需在
.env填入MAILJET_API_KEY,MAILJET_SECRET_KEY,MAILJET_SENDER_EMAIL
- 設定:
- Brevo:
- 設定:
EMAIL_PROVIDER=brevo - 需在
.env填入BREVO_API_KEY,BREVO_SENDER_EMAIL
- 設定:
應用程式啟動後,可透過瀏覽器存取內建資料庫:
- URL: http://localhost:8080/h2-console
- JDBC URL:
jdbc:h2:mem:testdb - User:
sa - Password:
password
位於 doc/diagram.md。
- 內容: 繪製 User 透過 SCSP 呼叫 EMSP 啟動 CPO 充電樁的時序圖 (Sequence Diagram)。
- 情境: 涵蓋 Start Session, Stop Session, CDR (充電紀錄) 回傳與帳單通知流程。
API 文件位於:http://localhost:8080/swagger-ui.html
- 會員註冊 (Registration)
- 使用 Email 註冊。
- 密碼經過 BCrypt 加密儲存。
- 註冊後發送開通 Email (含 Token)。
- 帳號開通 (Activation)
- 驗證 Email 中的 Token 以啟用帳號。
- 會員登入 (Login with 2FA)
- 第一階段: 驗證 Email 與密碼。驗證通過後發送 6 位數 2FA 驗證碼至 Email。
- 第二階段: 驗證 2FA 驗證碼,通過後回傳 Session Token (Mock)。
- 查詢系統 (User Query)
- 查詢登入使用者的最後登入時間 (
lastLoginTime)。
- 查詢登入使用者的最後登入時間 (
本專案採用 Clean Architecture 與 SOLID 原則進行設計,確保程式碼的可維護性與擴充性。
- Controller Layer: 處理 HTTP 請求與回應,使用
ApiResponse<T>統一回傳格式。 - Service Layer: 包含核心業務邏輯 (如 2FA 流程、Token 驗證)。
- Repository Layer: 資料存取層 (使用 Spring Data JPA)。
- DTO (Data Transfer Object): 定義 API 輸入輸出格式,避免直接暴露 Entity。
- Strategy Pattern: 透過
EmailService介面與多個實作 (Mock,Mailjet,Brevo),實現可抽換的 Email 服務策略。 - Global Exception Handling: 使用
@RestControllerAdvice與自定義AppException,統一處理錯誤並回傳標準化的錯誤訊息。 - Secure by Design:
- 使用
BCrypt進行密碼雜湊。 - 使用
SecureRandom產生高強度 2FA 驗證碼。 - 實作
AuthInterceptor攔截器,確保只有驗證通過的請求能存取受保護資源。
- 使用
- Logging: 採用 Logback 進行日誌管理。
- Rolling Policy: 每日自動滾動日誌檔案 (
application-yyyy-MM-dd.log)。 - Error Isolation: 獨立的
error.log檔案,便於快速定位嚴重錯誤。 - Retention: 自動清理 30 天前的日誌,避免磁碟空間耗盡。
- Rolling Policy: 每日自動滾動日誌檔案 (
- Dockerization: 提供 Multi-stage Dockerfile,優化映像檔大小與安全性。
- Configuration Management: 支援
.env與環境變數注入,實現 12-Factor App 的配置原則。 - Makefile: 封裝常用指令,簡化開發與部署流程。
專案包含完整的測試覆蓋:
- 單元測試 (Unit Tests): 針對
AuthService業務邏輯進行測試 (Mock Repository & EmailService)。 - 整合測試 (Integration Tests): 針對
AuthControllerAPI 進行end to end測試 (使用 H2 DB)。
執行指令:
make test本專案已部署至 Zeabur,可直接進行線上測試:
- 線上網址: https://den-den-assignment.zeabur.app
- Swagger UI: https://den-den-assignment.zeabur.app/swagger-ui/index.html
- Postman Collection: 位於 doc/DenDen Assignment API.postman_collection.json,可直接匯入 Postman 進行測試。