EVE Helper 项目编码模式和工作流程
本文档基于 Git 历史分析,总结了 EVE Helper 项目的编码模式、工作流程和最佳实践。
项目部分使用 Conventional Commits 格式 (约 6% 的提交):
<type>: <description>
类型:
- feat: 新功能
- fix: Bug 修复
- docs: 文档更新
- chore: 杂项任务
- test: 测试相关
- refactor: 重构
示例:
feat: 添加'ESI author Token'为空异常消息
feat: 迁移领域设计模型
docs: 添加CLAUDE.md开发指南
项目主要使用中文提交消息 (约 94% 的提交),格式为:
<序号>) <描述1> <序号>) <描述2> ...
示例:
1) DDD改版定稿 0.0.2-SNAPSHOT
1) 修复燃料不足提醒
1) 角色接口封装完成 2) 克隆接口封装完成 3) 联系人接口封装完成 4) 合同接口部分封装 5) 增加相关ESI接口的test
特点:
项目遵循领域驱动设计 (DDD) 架构,分为五层:
src/main/java/xyz/foolcat/eve/evehelper/
├── domain/ # 领域层 - 核心业务逻辑
│ ├── model/ # 领域模型 (entity, valueobject, aggregate)
│ ├── repository/ # 仓储接口
│ ├── service/ # 领域服务
│ └── specification/ # 业务规则规格
├── application/ # 应用层 - 用例协调
│ ├── service/ # 应用服务 (CommandBus, QueryBus)
│ ├── dto/ # 数据传输对象
│ ├── assembler/ # MapStruct 对象映射
│ ├── command/ # CQRS 命令
│ └── query/ # CQRS 查询
├── infrastructure/ # 基础设施层 - 技术实现
│ ├── persistence/ # 数据库访问 (mapper, repository impl)
│ ├── external/ # 外部服务集成 (ESI API)
│ └── config/ # 配置类
├── interfaces/ # 接口层 - 用户交互
│ └── web/ # REST 控制器
└── shared/ # 共享层 - 通用组件
├── kernel/ # 核心组件
├── result/ # 统一返回结果
└── util/ # 工具类
| 组件类型 | 命名模式 | 示例 |
|---|---|---|
| Controller | {Entity}Controller |
AssetsController, BlueprintsController |
| Service | {Entity}Service |
MiningDetailService, EsiApiService |
| Repository Interface | {Entity}Repository |
SysUserRepository, AssetsRepository |
| Repository Impl | {Entity}RepositoryImpl |
SysUserRepositoryImpl |
| Mapper | {Entity}Mapper |
AssetsMapper, MarketOrderMapper |
| Assembler | {Entity}Assembler |
SysUserAssembler, BlueprintsAssembler |
| DTO | {Entity}DTO |
MarketOrderDTO, UserDTO |
| PO | {Entity}PO |
SysUserPO, AssetsPO |
| Test | {Class}Test |
CharacterApiTest, MiningDetailServiceTest |
这是项目中最常见的工作流程 (基于历史提交分析):
步骤 1: 创建 API 客户端
infrastructure/external/esi/api/{Module}Api.java
步骤 2: 创建数据模型
infrastructure/external/esi/model/
├── send/ # 请求模型
└── sub/ # 响应模型
步骤 3: 编写测试
src/test/java/xyz/foolcat/eve/evehelper/esi/api/{Module}ApiTest.java
步骤 4: 集成到服务层
domain/service/esi/EsiApiService.java
或
domain/service/system/{Entity}Service.java
提交消息示例:
1) 角色接口封装完成 2) 增加对应接口返回数据对象 3) 增加相关ESI接口的test
步骤 1: 定义领域模型
domain/model/entity/system/{Entity}.java
步骤 2: 定义仓储接口
domain/repository/system/{Entity}Repository.java
步骤 3: 创建持久化对象
infrastructure/persistence/entity/system/{Entity}PO.java
步骤 4: 创建 MyBatis Mapper
infrastructure/persistence/mapper/system/{Entity}Mapper.java
src/main/resources/mappers/system/{Entity}Mapper.xml
步骤 5: 实现仓储
infrastructure/persistence/repository/system/{Entity}RepositoryImpl.java
步骤 6: 创建 Assembler
application/assembler/system/{Entity}Assembler.java
步骤 7: 创建领域服务
domain/service/system/{Entity}Service.java
步骤 8: 创建应用服务 (可选)
application/service/{Entity}ApplicationService.java
步骤 9: 创建 Controller
interfaces/web/controller/{Entity}Controller.java
步骤 10: 编写测试
src/test/java/xyz/foolcat/eve/evehelper/domain/service/system/{Entity}ServiceTest.java
src/test/java/xyz/foolcat/eve/evehelper/interfaces/web/controller/{Entity}ControllerTest.java
项目经历了从传统三层架构到 DDD 架构的迁移:
迁移步骤:
domain/model/entity/domain/repository/domain/service/ 或 application/service/infrastructure/persistence/interfaces/web/controller/相关提交:
feat: 迁移领域设计模型
1) DDD改版定稿 0.0.2-SNAPSHOT
src/test/java/xyz/foolcat/eve/evehelper/
├── controller/ # Controller 测试
│ ├── AssertsControllerTest.java
│ └── BlueprintsControllerTest.java
├── domain/
│ └── service/ # 领域服务测试
│ └── security/
│ └── LoginRateLimiterServiceTest.java
├── esi/
│ ├── api/ # ESI API 测试
│ │ ├── CharacterApiTest.java
│ │ ├── AssetsApiTest.java
│ │ └── ...
│ └── auth/ # ESI 认证测试
│ └── AuthorizeOAuthTest.java
└── service/
└── system/ # 系统服务测试
├── MiningDetailServiceTest.java
└── WalletJournalServiceTest.java
{ClassName}Test.java基于提交历史,项目重点测试:
基于 Git 历史分析,以下文件最常被修改:
| 文件 | 修改次数 | 说明 |
|---|---|---|
pom.xml |
16 | 依赖管理和版本更新 |
EsiApiService.java |
15 | ESI API 核心服务 |
application.yml |
11 | 配置文件更新 |
EsiCorporationApiService.java |
11 | 军团 API 服务 |
CharacterApi.java |
11 | 角色 API 客户端 |
AssetsApi.java |
11 | 资产 API 客户端 |
以下文件通常一起修改:
模式 1: API + Test
infrastructure/external/esi/api/{Module}Api.java
src/test/java/xyz/foolcat/eve/evehelper/esi/api/{Module}ApiTest.java
模式 2: Service + Mapper
domain/service/system/{Entity}Service.java
infrastructure/persistence/mapper/system/{Entity}Mapper.java
src/main/resources/mappers/system/{Entity}Mapper.xml
模式 3: Controller + Service
interfaces/web/controller/{Entity}Controller.java
domain/service/system/{Entity}Service.java
模式 4: Entity + PO + Assembler
domain/model/entity/system/{Entity}.java
infrastructure/persistence/entity/system/{Entity}PO.java
application/assembler/system/{Entity}Assembler.java
Mapper 接口:
@Mapper
public interface {Entity}Mapper extends BaseMapper<{Entity}PO> {
// 自定义查询方法
}
Mapper XML:
<!-- src/main/resources/mappers/system/{Entity}Mapper.xml -->
<mapper namespace="xyz.foolcat.eve.evehelper.infrastructure.persistence.mapper.system.{Entity}Mapper">
<!-- 自定义 SQL -->
</mapper>
Assembler 定义:
@Mapper(componentModel = "spring")
public interface {Entity}Assembler {
// PO -> Domain
{Entity} po2Domain({Entity}PO po);
// Domain -> PO
{Entity}PO domain2Po({Entity} entity);
// Domain -> DTO
{Entity}DTO domain2Dto({Entity} entity);
// DTO -> Domain
{Entity} dto2Domain({Entity}DTO dto);
}
认证流程:
关键组件:
JwtAuthorizationTokenFilter: JWT 过滤器TokenService: Token 管理TokenBlacklistService: Token 黑名单LoginRateLimiterService: 登录限流RbacAuthorizationManager: RBAC 授权OAuth 流程:
API 调用模式:
// 使用 WebClient 进行响应式调用
WebClient client = WebClient.builder()
.baseUrl(esiUrl)
.defaultHeader("Authorization", "Bearer " + accessToken)
.build();
CommandBus 和 QueryBus 分发.env.example)@ConfigurationPropertiesEveHelperExceptioninterfaces/web/advice/EsiException# 编辑 pom.xml
# 更新版本号
mvn clean install
{Module}Api.java 在 infrastructure/external/esi/api/infrastructure/external/esi/model/{Module}ApiTest.javaEsiApiService.javadomain/model/entity/system/domain/repository/system/infrastructure/persistence/entity/system/infrastructure/persistence/repository/system/# 运行所有测试
mvn test
# 运行单个测试类
mvn test -Dtest=CharacterApiTest
# 运行单个测试方法
mvn test -Dtest=CharacterApiTest#testGetCharacterInfo
本文档基于 200 条 Git 提交历史自动生成 最后更新: 2026-02-01