Files
workutils/项目目录结构说明.md
T
2026-06-09 09:32:34 +08:00

276 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目目录结构说明
> **项目名称**: workutils
> **技术栈**: Spring Boot 2.7.18 + Java 8 + Maven
> **项目类型**: Java 工作工具集项目(金融科技 FinTech 开发和维护工具集)
---
## 一、项目顶层目录
```
workutils/
├── export/ # 导出文件目录(运行结果输出)
├── logs/ # 日志文件目录
├── src/ # 源代码目录
├── target/ # Maven 编译输出目录(67个.class文件)
├── generator.rar # MyBatis Generator 压缩包
├── mvnw # Maven Wrapper(Unix/Mac)
├── mvnw.cmd # Maven Wrapper(Windows)
├── pom.xml # Maven 项目配置文件
├── 项目说明.md # 项目概述文档
└── 项目目录结构说明.md # 本文件
```
| 文件/目录 | 说明 |
|-----------|------|
| `pom.xml` | Maven 项目配置,定义依赖(Spring Boot、MyBatis、EasyExcel、JGit、Dubbo、Redis Jedis、OpenCSV 等) |
| `mvnw` / `mvnw.cmd` | Maven Wrapper 脚本,无需本地安装 Maven 即可构建项目 |
| `generator.rar` | MyBatis Generator 相关资源压缩包 |
| `export/` | 运行工具后输出的结果文件目录,按日期分子目录(如 `20260608/`) |
| `logs/` | 应用程序日志输出目录 |
| `target/` | Maven 编译产物,包含编译后的 `.class` 文件和资源文件副本 |
---
## 二、源码目录结构(`src/main/java/com/example/workutils/`)
```
src/main/java/com/example/workutils/
├── WorkUtilsApplication.java # 应用启动入口
├── system/ # 系统框架层(平台规范定义 + 共享基础设施)
│ ├── config/
│ │ └── WorkUtilsProperties.java # 全局配置属性类
│ ├── support/ # 共享基础设施
│ │ ├── ConsoleHelper.java # 控制台交互工具类
│ │ ├── FileOperationService.java# 文件操作服务(读取/扫描/写入/路径管理)
│ │ └── OutputService.java # 输出服务(CSV/Excel)
│ └── tool/ # Tool 契约与注册中心
│ ├── Tool.java # 工具契约接口(所有 biz 模块必须实现)
│ └── ToolRegistry.java # 工具注册中心(主菜单循环 + 按命令分发)
└── biz/ # 业务工具层(各模块是独立 Tool)
├── batch/ # 批量处理工具
│ └── BatchTool.java # 批量检查入口(实现 Tool)
├── git/ # Git 操作工具
│ ├── GitTool.java # Git 工具入口(实现 Tool)
│ └── service/ # 服务实现层
│ ├── GitService.java # Git 服务接口
│ ├── GitServiceImpl.java # Git 服务实现
│ ├── config/
│ │ └── GitOptimizationConfig.java # Git 性能优化配置
│ ├── model/
│ │ └── GitCommand.java # Git 命令传输对象
│ └── internal/ # 内部实现(不对外暴露)
│ ├── GitCommandController.java # Git 命令控制器(异步/中断)
│ ├── GitCommandExecutor.java # Git 命令执行器(核心)
│ ├── GitRepositoryManager.java # Git 仓库管理器
│ ├── GitResultCache.java # Git 结果缓存管理器
│ └── strategy/ # 策略模式实现
│ ├── GitCommandStrategy.java # 策略接口
│ ├── GitStrategyFactory.java # 策略工厂
│ ├── CheckBranchChangesStrategy.java
│ └── CheckoutAndPullStrategy.java
├── mybatisexport/ # MyBatis SQL导出工具(独立插件)
│ ├── MyBatisExportTool.java # SQL 导出入口(实现 Tool)
│ └── service/
│ ├── MyBatisExportService.java # SQL 导出服务
│ └── model/
│ └── MybatisTag.java # MyBatis 标签数据对象
├── mybatisgenerator/ # MyBatis逆向工程工具(独立插件)
│ ├── MyBatisGeneratorTool.java # 逆向工程入口(实现 Tool)
│ └── service/generator/
│ ├── MyBatisGeneratorService.java # 逆向工程服务
│ ├── CustomCommentGenerator.java # 自定义注释生成器
│ ├── LombokPlugin.java # Lombok 插件(@Data)
│ └── SelectiveOnlyPlugin.java # 只保留 Selective 方法插件
└── scanner/ # 扫描工具
├── ScannerTool.java # 扫描工具入口(实现 Tool)
└── service/ # 服务实现层
├── ScannerService.java # 扫描服务
└── config/
└── ScanConfig.java # 扫描配置
```
---
## 三、核心文件详解
### 3.1 入口层
#### `WorkUtilsApplication.java`
- **作用**: Spring Boot 应用启动类,实现 `CommandLineRunner`
- **功能**:
- 支持交互式菜单模式(无参数启动),委托 `ToolRegistry.runMainMenu()`
- 支持命令行模式,通过 `ToolRegistry.getToolByCommand()` 按命令名分发
- 不依赖任何具体业务 Service,完全解耦
---
### 3.2 系统框架层(`system/`)
#### `system/tool/Tool.java`
- **作用**: 工具契约接口,所有 biz 工具模块必须实现此接口
- **核心方法**: `getId()`、`getName()`、`getMenuOptions()`、`execute()`(模板方法,含默认实现)、`getCommandName()`(命令行模式)、`executeCommand()`(命令行模式执行)
#### `system/tool/ToolRegistry.java`
- **作用**: 工具注册中心,Spring 自动发现 `Tool` Bean,提供主菜单循环
- **功能**: 根据配置过滤启用/禁用工具,支持白名单(enabled)和黑名单(disabled)模式,维护按命令名的索引,支持命令行模式按命令名分发
#### `system/support/ConsoleHelper.java`
- **作用**: 控制台交互工具类(静态方法),统一控制台 I/O
#### `system/support/FileOperationService.java`
- **作用**: 文件操作服务,提供文件读取、扫描、写入、项目路径管理等基础能力
#### `system/support/OutputService.java`
- **作用**: 输出服务,负责将数据输出为 CSV(OpenCSV)或 Excel(EasyExcel)格式,支持单Sheet/多Sheet、追加写入等
#### `system/config/WorkUtilsProperties.java`
- **作用**: 全局配置属性类,绑定 `application.yml` 中 `workutils` 前缀的配置
- **功能**: 管理基础目录、配置目录、导出目录路径,提供带日期时间戳的导出文件路径生成,管理工具启用/禁用白名单和黑名单
---
### 3.3 业务工具层(`biz/`)
> **架构约定**: 每个 biz 模块的 Tool 类(如 `GitTool.java`)放在模块根目录作为入口,所有服务实现及附属文件(config/model/internal/generator)收在 `service/` 子包下,内部细节用 `internal/` 隔离。
#### 3.3.1 扫描工具(`biz/scanner/`)
| 文件 | 作用 |
|------|------|
| `ScannerTool.java` | 扫描工具入口(实现 Tool),负责菜单交互,委托 ScannerService 执行业务逻辑 |
| `service/ScannerService.java` | 扫描服务,支持关键词扫描、Redis Key 扫描、Dubbo 接口扫描三种类型,支持并发多项目扫描 |
| `service/config/ScanConfig.java` | 扫描配置,定义文件扩展名、排除目录、最大文件大小等参数 |
#### 3.3.2a MyBatis SQL导出工具(`biz/mybatisexport/`)
| 文件 | 作用 |
|------|------|
| `MyBatisExportTool.java` | SQL 导出工具入口(实现 Tool),负责菜单交互,委托 MyBatisExportService 执行 |
| `service/MyBatisExportService.java` | SQL 导出核心服务,从 XML 文件中提取 select/insert/update/delete 标签,支持按表名/关键字/标签ID 过滤导出为 CSV |
| `service/model/MybatisTag.java` | MyBatis 标签数据对象,封装 tagId、tagName、parameterType、resultMap、namespace |
#### 3.3.2b MyBatis逆向工程工具(`biz/mybatisgenerator/`)
| 文件 | 作用 |
|------|------|
| `MyBatisGeneratorTool.java` | 逆向工程工具入口(实现 Tool),负责菜单交互,委托 MyBatisGeneratorService 执行 |
| `service/generator/MyBatisGeneratorService.java` | MyBatis 逆向工程服务,根据数据库表生成 PO、Mapper 接口、XML 映射文件 |
| `service/generator/CustomCommentGenerator.java` | 自定义注释生成器,生成简洁中文注释 |
| `service/generator/LombokPlugin.java` | Lombok 插件,为 PO 类添加 `@Data` 注解 |
| `service/generator/SelectiveOnlyPlugin.java` | 自定义插件,只保留 `insertSelective` 和 `updateByPrimaryKeySelective` |
> **设计说明**: 原 `biz/mybatis/` 已按工具维度拆分为 `mybatisexport` 和 `mybatisgenerator` 两个独立包,为后续**插件化设计**做准备——每个工具将独立打包、独立加载。
#### 3.3.3 Git 工具(`biz/git/`)
| 文件 | 作用 |
|------|------|
| `GitTool.java` | Git 工具入口(实现 Tool),负责菜单交互,委托 GitService 执行 |
| `service/GitService.java` | Git 服务接口,定义分支变更检查、切换拉取、健康检测、修复仓库等方法 |
| `service/GitServiceImpl.java` | Git 服务实现,协调各策略执行仓库健康检测和修复逻辑 |
| `service/config/GitOptimizationConfig.java` | Git 性能优化配置,管理超时、线程池、缓存、批处理、Fetch、网络等参数 |
| `service/model/GitCommand.java` | Git 命令传输对象,定义命令类型枚举(CHECK_BRANCH_CHANGES、CHECKOUT_AND_PULL 等6种) |
| `service/internal/GitCommandExecutor.java` | **核心执行器**,封装原生 git 命令执行(跨平台),提供超时控制、并发线程池、命令批处理 |
| `service/internal/GitCommandController.java` | Git 命令控制器,管理命令的异步执行、跳过、中断 |
| `service/internal/GitRepositoryManager.java` | Git 仓库管理器,提供仓库发现、分支操作、批量操作等高级封装 |
| `service/internal/GitResultCache.java` | Git 结果缓存管理器,缓存仓库信息/分支信息/提交ID,减少重复 git 命令 |
| `service/internal/strategy/GitCommandStrategy.java` | Git 命令策略接口 |
| `service/internal/strategy/GitStrategyFactory.java` | Git 策略工厂,注册和管理所有策略实现 |
| `service/internal/strategy/CheckBranchChangesStrategy.java` | 分支变更检查策略,比较两个分支的差异 |
| `service/internal/strategy/CheckoutAndPullStrategy.java` | 切换并拉取策略,批量切换分支并拉取最新代码 |
#### 3.3.4 批量工具(`biz/batch/`)
| 文件 | 作用 |
|------|------|
| `BatchTool.java` | 批量处理工具入口(实现 Tool),显示批量检查选项,委托各 Service 执行 |
---
## 四、资源配置文件(`src/main/resources/`)
```
src/main/resources/
├── application.yml # Spring Boot 主配置文件
├── logback.xml # 日志框架配置
├── mybatis-generator.xml # MyBatis Generator 配置文件
├── mybatis-generator.properties # MyBatis Generator 数据库连接配置
└── config/
└── 代码仓库项目路径.txt # 要扫描的代码仓库路径列表(含状态标记)
```
| 文件 | 说明 |
|------|------|
| `application.yml` | 配置应用名、`workutils` 路径配置、工具启用/禁用、日志级别 |
| `logback.xml` | Logback 日志配置,控制台输出格式为 `HH:mm:ss.SSS [线程] 级别 Logger - 消息` |
| `mybatis-generator.xml` | MyBatis Generator 配置,引用自定义插件(LombokPlugin、SelectiveOnlyPlugin、CustomCommentGenerator),配置模型/Mapper/XML 生成路径 |
| `mybatis-generator.properties` | 数据库连接信息(MySQL),JDBC URL/用户名/密码/驱动路径,以及生成的包路径 |
| `代码仓库项目路径.txt` | 待扫描的代码仓库绝对路径列表,每行格式 `路径|状态`(NORMAL/CORRUPTED),共约72个项目 |
---
## 五、设计模式与架构特点
| 模式/特点 | 应用位置 | 说明 |
|-----------|---------|------|
| **策略模式** | `Tool` 接口 + 各 biz Tool 实现 | 各工具通过实现 `Tool` 接口注册到 `ToolRegistry`,可插拔扩展,支持交互和命令行双模式 |
| **策略模式** | `GitCommandStrategy` + 各 Strategy 实现 | Git 命令执行策略,`GitStrategyFactory` 管理注册 |
| **工厂模式** | `ToolRegistry`、`GitStrategyFactory` | Spring 自动发现和注入 Bean |
| **命令模式** | `GitCommand` + `GitCommandController` | 封装 Git 命令的异步执行、中断、跳过 |
| **缓存模式** | `GitResultCache` | 缓存 Git 查询结果,减少重复命令执行 |
| **并发处理** | `GitCommandExecutor`、`ScannerService` | 线程池并发执行 Git 命令和多项目扫描 |
| **过滤器模式** | `MyBatisExportService` 内部类 | `SqlFilter` 接口实现表名/关键字/标签ID 过滤 |
| **模板回调** | `FileOperationService.scanFilesRecursively` | 使用 `SimpleFileVisitor` 实现文件遍历回调 |
| **分层架构** | `system/` vs `biz/` | system 定义平台契约与共享基础设施,biz 实现具体工具 |
| **内部隔离** | `biz/*/service/internal/` | 内部实现类用 `internal/` 隔离,不对外暴露 |
---
## 六、依赖关系图
```
WorkUtilsApplication (入口)
├── 交互模式 → ToolRegistry.runMainMenu()
│ └── ToolRegistry.getEnabledTools()
│ ├── ScannerTool ────────────→ ScannerService
│ ├── MyBatisExportTool ──────→ MyBatisExportService
│ ├── MyBatisGeneratorTool ───→ MyBatisGeneratorService
│ ├── GitTool ────────────────→ GitService → GitStrategyFactory
│ └── BatchTool ──────────────→ ScannerService + MyBatisExportService
│
└── 命令行模式 → ToolRegistry.getToolByCommand(command)
├── "scan" → ScannerTool.executeCommand(args)
├── "sql" → MyBatisExportTool.executeCommand(args)
├── "batch" → BatchTool.executeCommand(args)
└── "git" → GitTool.executeCommand(args)
(启动类不依赖任何具体业务 Service)
核心依赖链:
ScannerService → FileOperationService + OutputService
MyBatisExportService → FileOperationService + OutputService
GitService → FileOperationService + GitCommandExecutor
OutputService → FileOperationService + WorkUtilsProperties
FileOperationService → WorkUtilsProperties
```
---
## 七、问题与改进建议
### 7.1 已知问题
| 问题 | 位置 | 说明 |
|------|------|------|
| 配置文件硬编码 | `mybatis-generator.properties` | 包含明文密码 |
| pom.xml 重复依赖 | `fastjson` 1.2.83 和 2.0.57 | 两个版本的 fastjson 同时存在 |
| 项目说明版本不匹配 | `项目说明.md` | 描述为 Spring Boot 3.2.3 + Java 21,实际为 Spring Boot 2.7.18 + Java 8 |
### 7.2 重构建议
1. **统一 fastjson 版本**,建议只保留 2.0.57
2. **将数据库密码移到外部配置文件**或使用环境变量
3. **更新 `项目说明.md`** 使其与实际技术栈一致
4. **增加单元测试**,目前无测试代码