Files
homeutils/项目目录结构说明.md
T
2026-06-08 17:53:41 +08:00

294 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/ # 系统框架层
│ ├── ConsoleHelper.java # 控制台交互工具类(消除重复I/O代码)
│ ├── config/
│ │ └── WorkUtilsProperties.java # 全局配置属性类
│ ├── menu/
│ │ └── MenuRunner.java # 交互式菜单运行器
│ └── tool/
│ ├── Tool.java # 工具策略接口
│ ├── AbstractTool.java # 工具基类(模板方法模式)
│ └── ToolRegistry.java # 工具注册中心
└── biz/ # 业务模块层
├── git/ # Git操作业务模块
│ ├── config/
│ │ └── GitOptimizationConfig.java # Git性能优化配置
│ ├── menu/
│ │ └── GitMenu.java # Git仓库健康检测菜单(仅交互逻辑)
│ ├── model/
│ │ └── GitCommandDTO.java # Git命令传输对象
│ ├── service/
│ │ ├── GitCommandStrategy.java # Git命令策略接口
│ │ ├── GitService.java # Git服务接口
│ │ └── impl/
│ │ ├── GitServiceImpl.java # Git服务实现
│ │ ├── GitStrategyFactory.java # Git策略工厂
│ │ └── strategy/
│ │ ├── CheckBranchChangesStrategy.java # 检查分支变更策略
│ │ └── CheckoutAndPullStrategy.java # 切换并拉取策略
│ └── util/
│ ├── GitCommandController.java # Git命令控制器(异步/中断)
│ ├── GitCommandExecutor.java # Git命令执行器(核心)
│ ├── GitRepositoryManager.java # Git仓库管理器
│ └── GitResultCache.java # Git结果缓存管理器
├── mybatis/ # MyBatis业务模块
│ ├── export/
│ │ └── MyBatisExportService.java # MyBatis SQL导出服务
│ ├── generator/
│ │ ├── CustomCommentGenerator.java # 自定义注释生成器
│ │ ├── LombokPlugin.java # Lombok插件(@Data)
│ │ ├── MyBatisGeneratorService.java # MyBatis逆向工程服务
│ │ └── SelectiveOnlyPlugin.java # 只保留Selective方法插件
│ ├── menu/
│ │ ├── MyBatisMenu.java # MyBatis SQL导出菜单(仅交互逻辑)
│ │ └── MyBatisGeneratorMenu.java # MyBatis逆向工程菜单(仅交互逻辑)
│ ├── model/
│ │ └── MybatisTagBO.java # MyBatis标签数据对象
│ └── service/
│ └── XMLMapperChecker.java # XML Mapper检查器(旧版,包路径异常)
├── output/
│ ├── OutputService.java # 输出服务(CSV/Excel)
│ └── menu/
│ └── BatchMenu.java # 批量处理菜单(仅交互逻辑)
└── scanner/ # 扫描业务模块
├── config/
│ └── ScanConfigBO.java # 扫描配置对象
├── menu/
│ └── ScanMenu.java # 扫描功能菜单(仅交互逻辑)
└── service/
├── FileOperationService.java # 文件操作服务
└── ScanService.java # 扫描服务
```
---
## 三、核心文件详解
### 3.1 入口层
#### `WorkUtilsApplication.java`
- **作用**: Spring Boot 应用启动类,实现 `CommandLineRunner`
- **功能**:
- 支持交互式菜单模式(无参数启动)
- 支持命令行模式,通过 `ToolRegistry.getToolByCommand()` 按命令名分发到对应 Tool
- 不依赖任何具体业务 Service,完全解耦
---
### 3.2 系统框架层(`system/`)
#### `config/WorkUtilsProperties.java`
- **作用**: 全局配置属性类,绑定 `application.yml` 中 `workutils` 前缀的配置
- **功能**:
- 管理基础目录、配置目录、导出目录路径
- 提供带日期时间戳的导出文件路径生成
- 管理工具启用/禁用白名单和黑名单
#### `tool/Tool.java`
- **作用**: 工具策略接口,所有可插拔工具需实现此接口
- **核心方法**: `getId()`、`getName()`、`getMenuOptions()`、`execute()`、`getCommandName()`(命令行模式命令名)、`executeCommand()`(命令行模式执行)
#### `tool/AbstractTool.java`
- **作用**: 工具基类,使用模板方法模式
- **功能**: 提供标准菜单交互循环(显示菜单→读取选择→处理选择→循环),子类只需实现 `handleChoice()`
- **控制台I/O**: 委托给 `ConsoleHelper`,子类通过 `printMenuTitle()`、`displayMenu()` 等 protected 方法间接调用
#### `ConsoleHelper.java`
- **作用**: 控制台交互工具类(静态方法)
- **功能**: 统一 `MenuRunner` 和 `AbstractTool` 中重复的控制台 I/O 方法,消除代码重复
#### `tool/ToolRegistry.java`
- **作用**: 工具注册中心,Spring 自动发现 `Tool` Bean
- **功能**: 根据配置过滤启用/禁用工具,支持白名单(enabled)和黑名单(disabled)模式,同时维护按命令名(`getCommandName()`)的索引,支持命令行模式按命令名分发
---
### 3.3 菜单层(`system/menu/`)
#### `MenuRunner.java`
- **作用**: 交互式主菜单运行器
- **功能**: 从 `ToolRegistry` 动态构建主菜单,无需硬编码 Menu 引用
> **重构说明**: 原先的 `menu/handler/` 下的 Handler 类已全部移除。菜单交互类已分散到各业务模块的 `menu/` 子包中,统一命名为 `XxxMenu`,仅负责菜单展示和用户交互,业务逻辑委托给对应 Service。
---
### 3.4 业务模块(`biz/`)
#### 3.4.1 Git 操作模块(`biz/git/`)
| 文件 | 作用 |
|------|------|
| `menu/GitMenu.java` | **Git 菜单类**(仅交互),显示菜单、接收用户输入、委托 GitService 执行业务逻辑 |
| `GitOptimizationConfig.java` | Git 性能优化配置类,管理超时、线程池、缓存、批处理、Fetch、网络等配置参数 |
| `GitCommandDTO.java` | Git 命令传输对象,定义命令类型枚举(CHECK_BRANCH_CHANGES、CHECKOUT_AND_PULL 等6种) |
| `GitService.java` | Git 服务接口,定义分支变更检查、切换拉取、健康检测、修复仓库等方法 |
| `GitCommandStrategy.java` | Git 命令策略接口,策略模式的核心接口 |
| `GitServiceImpl.java` | Git 服务实现,协调各策略执行,实现仓库健康检测和修复逻辑 |
| `GitStrategyFactory.java` | Git 策略工厂,注册和管理所有策略实现 |
| `CheckBranchChangesStrategy.java` | 分支变更检查策略实现,比较两个分支的差异 |
| `CheckoutAndPullStrategy.java` | 切换并拉取策略实现,批量切换分支并拉取最新代码 |
| `GitCommandExecutor.java` | **核心执行器**,封装原生 git 命令执行(支持 Windows/Linux),提供超时控制、并发线程池、命令批处理 |
| `GitCommandController.java` | Git 命令控制器,管理命令的异步执行、跳过、中断功能 |
| `GitRepositoryManager.java` | Git 仓库管理器,提供仓库发现、分支操作、批量操作等高级封装 |
| `GitResultCache.java` | Git 结果缓存管理器,缓存仓库信息/分支信息/提交ID,减少重复 git 命令 |
#### 3.4.2 MyBatis 模块(`biz/mybatis/`)
| 文件 | 作用 |
|------|------|
| `menu/MyBatisMenu.java` | **MyBatis SQL 导出菜单**(仅交互),显示导出选项、接收用户输入、委托 MyBatisExportService 执行 |
| `menu/MyBatisGeneratorMenu.java` | **MyBatis 逆向工程菜单**(仅交互),显示生成选项、接收用户输入、委托 MyBatisGeneratorService 执行 |
| `MyBatisExportService.java` | **MyBatis SQL 导出核心服务**,从 XML 文件中提取 select/insert/update/delete 标签,支持按表名、关键字、标签ID 过滤导出为 CSV |
| `XMLMapperChecker.java` | XML Mapper 检查器,检查 XML 文件格式是否正确(注意:此文件包路径为 `com.example.workutils.service`,与项目结构不一致) |
| `MybatisTagBO.java` | MyBatis 标签数据对象,封装 tagId、tagName、parameterType、resultMap、namespace 等信息 |
| `MyBatisGeneratorService.java` | MyBatis 逆向工程服务,根据数据库表生成 PO、Mapper 接口、XML 映射文件 |
| `CustomCommentGenerator.java` | 自定义注释生成器,生成简洁中文注释(字段备注、方法名中文说明) |
| `LombokPlugin.java` | Lombok 插件,为 PO 类添加 `@Data` 注解并禁用 getter/setter 方法生成 |
| `SelectiveOnlyPlugin.java` | 自定义插件,只保留 `insertSelective` 和 `updateByPrimaryKeySelective`,移除全字段版本 |
#### 3.4.3 输出模块(`biz/output/`)
| 文件 | 作用 |
|------|------|
| `menu/BatchMenu.java` | **批量处理菜单**(仅交互),显示批量检查选项、接收用户输入、委托各 Service 执行 |
| `OutputService.java` | 输出服务,负责将数据输出为 CSV(OpenCSV)或 Excel(EasyExcel)格式,支持单Sheet/多Sheet、追加写入等 |
#### 3.4.4 扫描模块(`biz/scanner/`)
| 文件 | 作用 |
|------|------|
| `menu/ScanMenu.java` | **扫描功能菜单**(仅交互),显示扫描选项、接收用户输入、委托 ScanService 执行 |
| `ScanConfigBO.java` | 扫描配置对象,定义文件扩展名、排除目录、最大文件大小等扫描参数 |
| `FileOperationService.java` | 文件操作服务,提供文件读取、扫描、写入、项目路径管理等基础能力 |
| `ScanService.java` | 扫描服务,支持关键词扫描、Redis Key 扫描、Dubbo 接口扫描三种类型,支持并发多项目扫描 |
---
## 四、资源配置文件(`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` + `AbstractTool` + Menu 实现 | 各工具通过实现 `Tool` 接口注册,可插拔扩展,支持交互和命令行双模式 |
| **模板方法模式** | `AbstractTool` | 定义菜单交互骨架,子类实现 `handleChoice()` |
| **策略模式** | `GitCommandStrategy` + 各 Strategy 实现 | Git 命令执行策略,`GitStrategyFactory` 管理注册 |
| **工厂模式** | `ToolRegistry`、`GitStrategyFactory` | 自动发现和注册 Bean |
| **命令模式** | `GitCommandDTO` + `GitCommandController` | 封装 Git 命令的异步执行、中断、跳过 |
| **缓存模式** | `GitResultCache` | 缓存 Git 查询结果,减少重复命令执行 |
| **并发处理** | `GitCommandExecutor`、`ScanService` | 线程池并发执行 Git 命令和多项目扫描 |
| **过滤器模式** | `MyBatisExportService` 内部类 | `SqlFilter` 接口实现表名/关键字/标签ID 过滤 |
| **模板回调** | `FileOperationService.scanFilesRecursively` | 使用 `SimpleFileVisitor` 实现文件遍历回调 |
| **工具类提取** | `ConsoleHelper` | 提取 `MenuRunner` 和 `AbstractTool` 中的重复控制台 I/O 代码 |
---
## 六、依赖关系图
```
WorkUtilsApplication (入口)
├── 交互模式 → MenuRunner
│ └── ToolRegistry.getEnabledTools()
│ ├── GitMenu ────────────────→ GitService
│ ├── MyBatisMenu ────────────→ MyBatisExportService
│ ├── MyBatisGeneratorMenu ───→ MyBatisGeneratorService
│ ├── ScanMenu ───────────────→ ScanService
│ └── BatchMenu ──────────────→ ScanService + MyBatisExportService
│
└── 命令行模式 → ToolRegistry.getToolByCommand(command)
├── "sql" → MyBatisMenu.executeCommand(args)
├── "scan" → ScanMenu.executeCommand(args)
└── "batch" → BatchMenu.executeCommand(args)
(启动类不依赖任何具体业务Service)
核心依赖链:
MyBatisExportService → FileOperationService + OutputService
ScanService → FileOperationService + OutputService
GitServiceImpl → FileOperationService + GitCommandExecutor
OutputService → FileOperationService + WorkUtilsProperties
FileOperationService → WorkUtilsProperties
```
---
## 七、问题与改进建议
### 7.1 发现的问题
| 问题 | 位置 | 说明 |
|------|------|------|
| 包路径不一致 | `XMLMapperChecker.java` | 实际包路径 `com.example.workutils.service`,但位于 `biz/mybatis/service/` 目录下 |
| 未使用文件 | `XMLMapperChecker.java` | 代码中没有任何地方引用此类 |
| 配置文件硬编码 | `mybatis-generator.properties` | 包含明文密码 `1Qaz@4772` |
| 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. **修复 `XMLMapperChecker` 包路径**,或将其删除(未被引用)
2. **统一 fastjson 版本**,建议只保留 2.0.57
3. **将数据库密码移到外部配置文件**或使用环境变量
4. **更新 `项目说明.md`** 使其与实际技术栈一致
5. **考虑提取公共的 CSV 操作到 `OutputService`**,减少 `MyBatisExportService` 中的 CSV 相关代码
6. **增加单元测试**,目前无测试代码