项目目录结构说明
项目名称: workutils
技术栈: Spring Boot 2.7.18 + Java 8 + Maven
项目类型: Java 工作工具集项目(金融科技 FinTech 开发和维护工具集)
一、项目顶层目录
| 文件/目录 |
说明 |
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/)
三、核心文件详解
3.1 入口层
WorkUtilsApplication.java
- 作用: Spring Boot 应用启动类,实现
CommandLineRunner
- 功能:
- 支持交互式菜单模式(无参数启动)
- 支持命令行模式,通过
ToolRegistry.getToolByCommand() 按命令名分发到对应 Tool
- 不依赖任何具体业务 Service,完全解耦
WorkUtilsProperties.java
- 作用: 全局配置属性类,绑定
application.yml 中 workutils 前缀的配置
- 功能:
- 管理基础目录、配置目录、导出目录路径
- 提供带日期时间戳的导出文件路径生成
- 管理工具启用/禁用白名单和黑名单
3.2 工具框架层(tool/)
Tool.java
- 作用: 工具策略接口,所有可插拔工具需实现此接口
- 核心方法:
getId()、getName()、getMenuOptions()、execute()、getCommandName()(命令行模式命令名)、executeCommand()(命令行模式执行)
AbstractTool.java
- 作用: 工具基类,使用模板方法模式
- 功能: 提供标准菜单交互循环(显示菜单→读取选择→处理选择→循环),子类只需实现
handleChoice()
- 控制台I/O: 委托给
ConsoleHelper,子类通过 printMenuTitle()、displayMenu() 等 protected 方法间接调用
ConsoleHelper.java
- 作用: 控制台交互工具类(静态方法)
- 功能: 统一
MenuRunner 和 AbstractTool 中重复的控制台 I/O 方法,消除代码重复
ToolRegistry.java
- 作用: 工具注册中心,Spring 自动发现
Tool Bean
- 功能: 根据配置过滤启用/禁用工具,支持白名单(enabled)和黑名单(disabled)模式,同时维护按命令名(
getCommandName())的索引,支持命令行模式按命令名分发
- 作用: 交互式主菜单运行器
- 功能: 从
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/)
| 文件 |
说明 |
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 |
待扫描的代码仓库绝对路径列表,每行格式 `路径 |
五、设计模式与架构特点
| 模式/特点 |
应用位置 |
说明 |
| 策略模式 |
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 代码 |
六、依赖关系图
七、问题与改进建议
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 重构建议
- 修复
XMLMapperChecker 包路径,或将其删除(未被引用)
- 统一 fastjson 版本,建议只保留 2.0.57
- 将数据库密码移到外部配置文件或使用环境变量
- 更新
项目说明.md 使其与实际技术栈一致
- 考虑提取公共的 CSV 操作到
OutputService,减少 MyBatisExportService 中的 CSV 相关代码
- 增加单元测试,目前无测试代码