代码提交

This commit is contained in:
张家训
2026-06-16 17:41:14 +08:00
parent 089558ddcd
commit a641796a0b
19 changed files with 99 additions and 230 deletions
+380
View File
@@ -0,0 +1,380 @@
# 项目目录结构说明
> **项目名称**: workutils
> **技术栈**: Spring Boot 2.7.18 + Java 8 + Maven
> **项目类型**: Java 工作工具集项目(金融科技 FinTech 开发和维护工具集)
---
## 一、项目顶层目录
```
workutils/
├── docs/ # 项目文档
│ ├── 项目说明.md
│ └── 项目目录结构说明.md
├── scripts/ # 构建/启动脚本
│ ├── build_release.bat # 生产构建脚本
│ ├── start.bat # 快速启动入口
│ └── start-jar.bat # jar 启动脚本(UTF-8)
├── src/ # 源代码目录
├── lib/ # Maven 本地文件仓库(jfxrt.jar 等)
├── target/ # Maven 编译输出
├── mvnw # Maven Wrapper(Unix/Mac)
├── mvnw.cmd # Maven Wrapper(Windows)
├── pom.xml # Maven 项目配置文件
├── .gitignore # Git 忽略规则
│
├── (运行时生成,已 gitignore)
├── data/ # 运行时配置文件和数据
│ ├── workutils.config # 外部配置
│ ├── project_paths.txt # 项目路径数据
│ └── damaged_repos.cache # 损坏仓库缓存
├── logs/ # 运行时日志
├── export/ # 运行时导出文件(按日期子目录)
└── build.log # 构建日志
```
| 文件/目录 | 说明 |
|-----------|------|
| `docs/` | 项目文档目录 |
| `scripts/` | 构建/启动脚本目录,包含构建打包、启动入口等 |
| `lib/` | Maven 本地文件仓库,存放 jfxrt.jar 等外部依赖 |
| `pom.xml` | Maven 项目配置,定义依赖(Spring Boot、MyBatis、EasyExcel、JGit、Dubbo、Redis Jedis、OpenCSV 等) |
| `mvnw` / `mvnw.cmd` | Maven Wrapper 脚本,无需本地安装 Maven 即可构建项目 |
| `logs/` | 应用程序运行时日志输出目录 |
| `export/` | 运行工具后输出的结果文件目录,按日期分子目录(如 `20260608/`) |
| `target/` | Maven 编译产物,包含编译后的 `.class` 文件和资源文件副本 |
| `data/` | 运行时配置文件和数据目录 |
| `data/workutils.config` | 外部配置文件,首次运行时从 `application.yml` 自动生成 |
| `data/project_paths.txt` | 项目路径配置,首次运行时从模板 `templates/project_paths.txt` 复制 |
| `data/damaged_repos.cache` | 损坏仓库缓存,首次运行时从模板复制 |
---
## 二、源码目录结构(`src/main/java/com/example/workutils/`)
```
src/main/java/com/example/workutils/
├── WorkUtilsApplication.java # 应用启动入口
├── system/ # 系统框架层(平台规范定义 + 共享基础设施)
│ ├── config/
│ │ └── WorkUtilsProperties.java # 全局配置属性类
│ ├── support/ # 共享基础设施
│ │ ├── ConsoleHelper.java # 控制台交互工具类
│ │ ├── FileOperationHelper.java # 文件操作工具类(读取/扫描/写入/路径管理)
│ │ └── OutputHelper.java # 输出工具类(CSV/Excel)
│ └── plugin/ # 插件化框架
│ ├── Plugin.java # 插件接口(生命周期 + 菜单 + 命令的统一契约)
│ ├── PluginDescriptor.java # 插件描述符(id/name/version/description/dependencies)
│ ├── PluginContext.java # 插件运行时上下文
│ ├── PluginManager.java # 插件管理器(生命周期 + 注册 + 主菜单 + 命令分发)
│ └── PluginState.java # 插件状态枚举(UNLOADED/LOADED/ACTIVE/DISABLED/ERROR)
└── biz/ # 业务插件层(各模块实现 Plugin 接口)
├── diff/ # 文本对比插件
│ ├── DiffPlugin.java # 文本差异对比(实现 Plugin),支持可视化窗口
│ └── DiffWindow.java # Swing 可视化对比窗口(左右粘贴文本,一键对比)
├── git/ # Git 操作插件
│ ├── GitPlugin.java # Git 插件入口(实现 Plugin)
│ └── 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导出插件
│ ├── MyBatisExportPlugin.java # SQL 导出入口(实现 Plugin)
│ └── service/
│ ├── MyBatisExportService.java # SQL 导出服务
│ └── model/
│ └── MybatisTag.java # MyBatis 标签数据对象
├── mybatisgenerator/ # MyBatis逆向工程插件
│ ├── MyBatisGeneratorPlugin.java # 逆向工程入口(实现 Plugin)
│ └── service/generator/
│ ├── MyBatisGeneratorService.java # 逆向工程服务
│ ├── CustomCommentGenerator.java # 自定义注释生成器
│ ├── LombokPlugin.java # Lombok 插件(@Data)
│ └── SelectiveOnlyPlugin.java # 只保留 Selective 方法插件
└── scanner/ # 扫描插件
├── ScannerPlugin.java # 扫描工具入口(实现 Plugin)
└── service/ # 服务实现层
├── ScannerService.java # 扫描服务
└── config/
└── ScanConfig.java # 扫描配置
```
---
## 三、核心文件详解
### 3.1 入口层
#### `WorkUtilsApplication.java`
- **作用**: Spring Boot 应用启动类,实现 `CommandLineRunner`
- **功能**:
- 支持交互式菜单模式(无参数启动),委托 `PluginManager.runMainMenu()`
- 支持命令行模式,通过 `PluginManager.getPluginByCommand()` 按命令名分发
- 不依赖任何具体业务 Service,完全解耦
---
### 3.2 系统框架层(`system/`)
#### 3.2.1 插件化框架(`system/plugin/`)
| 文件 | 作用 |
|------|------|
| `Plugin.java` | **插件接口**,定义 `getDescriptor()`、`getId()`、`getName()`、`getMenuOptions()`、`execute()`、`handleChoice()`、`getCommandName()`、`executeCommand()`、`onLoad(PluginContext)`、`onUnload()` 等完整契约 |
| `PluginDescriptor.java` | 插件描述符(不可变),包含 `id`、`name`、`version`、`description`、`dependencies`,通过 Builder 模式构建 |
| `PluginContext.java` | 插件运行时上下文,提供 `PluginManager` 引用和跨插件共享属性 |
| `PluginManager.java` | **插件管理器**(`@Component`),负责:生命周期管理(load/enable/disable)、注册发现(按 id/command 查找)、启用过滤(白名单/黑名单)、主菜单交互循环、命令行分发 |
| `PluginState.java` | 插件状态枚举:`UNLOADED` → `LOADED` → `ACTIVE` / `DISABLED` / `ERROR` |
#### 3.2.3 共享基础设施(`system/support/`)
| 文件 | 作用 |
|------|------|
| `ConsoleHelper.java` | 控制台交互工具类(静态方法),统一控制台 I/O |
| `FileOperationHelper.java` | 文件操作工具类,提供文件读取、扫描、写入、项目路径管理等基础能力 |
| `OutputHelper.java` | 输出工具类,负责将数据输出为 CSV(OpenCSV)或 Excel(EasyExcel)格式 |
#### 3.2.4 全局配置(`system/config/`)
| 文件 | 作用 |
|------|------|
| `WorkUtilsProperties.java` | 全局配置属性类(`@ConfigurationProperties`),管理路径、工具启用/禁用(`ToolsConfig`) |
---
### 3.3 业务插件层(`biz/`)
> **架构约定**: 每个 biz 模块的 Plugin 类放在模块根目录,实现 `Plugin` 接口。通过静态 `PluginDescriptor` 声明插件元数据(id/name/version/description)。所有服务实现及附属文件收在 `service/` 子包下,内部细节用 `internal/` 隔离。
#### 3.3.1 扫描插件(`biz/scanner/`)
| 文件 | 作用 |
|------|------|
| `ScannerPlugin.java` | 扫描插件入口(实现 Plugin),版本 `1.0.0`,负责菜单交互,委托 ScannerService 执行业务逻辑 |
| `service/ScannerService.java` | 扫描服务,支持关键词扫描、Redis Key 扫描、Dubbo 接口扫描三种类型,支持并发多项目扫描 |
| `service/config/ScanConfig.java` | 扫描配置,定义文件扩展名、排除目录、最大文件大小等参数 |
#### 3.3.2a MyBatis SQL导出插件(`biz/mybatisexport/`)
| 文件 | 作用 |
|------|------|
| `MyBatisExportPlugin.java` | SQL 导出插件入口(实现 Plugin),版本 `1.0.0`,负责菜单交互 |
| `service/MyBatisExportService.java` | SQL 导出核心服务,从 XML 文件中提取 select/insert/update/delete 标签 |
| `service/model/MybatisTag.java` | MyBatis 标签数据对象 |
#### 3.3.2b MyBatis逆向工程插件(`biz/mybatisgenerator/`)
| 文件 | 作用 |
|------|------|
| `MyBatisGeneratorPlugin.java` | 逆向工程插件入口(实现 Plugin),版本 `1.0.0` |
| `service/generator/MyBatisGeneratorService.java` | MyBatis 逆向工程服务 |
| `service/generator/CustomCommentGenerator.java` | 自定义注释生成器 |
| `service/generator/LombokPlugin.java` | Lombok 插件(@Data) |
| `service/generator/SelectiveOnlyPlugin.java` | 只保留 Selective 方法插件 |
#### 3.3.3 Git 插件(`biz/git/`)
| 文件 | 作用 |
|------|------|
| `GitPlugin.java` | Git 插件入口(实现 Plugin),版本 `1.0.0` |
| `service/GitService.java` | Git 服务接口 |
| `service/GitServiceImpl.java` | Git 服务实现 |
| `service/config/GitOptimizationConfig.java` | Git 性能优化配置 |
| `service/model/GitCommand.java` | Git 命令传输对象 |
| `service/internal/GitCommandExecutor.java` | **核心执行器**,跨平台 git 命令执行 |
| `service/internal/GitCommandController.java` | Git 命令控制器(异步/中断) |
| `service/internal/GitRepositoryManager.java` | Git 仓库管理器 |
| `service/internal/GitResultCache.java` | Git 结果缓存管理器 |
| `service/internal/strategy/*` | 策略模式实现 |
#### 3.3.4 文本对比插件(`biz/diff/`)
| 文件 | 作用 |
|------|------|
| `DiffPlugin.java` | 文本对比插件入口(实现 Plugin),版本 `1.0.0`,基于 LCS 算法行级精确对比,支持**粘贴可视化窗口**、文件对比、目录对比三种模式 |
| `DiffWindow.java` | **JavaFX** 可视化对比窗口。上半区粘贴原文/对比文,下半区 **WebView** 渲染字符级差异(浅红背景=删除字符,浅绿背景=新增字符,无色=相同),支持行+字符两级 LCS 算法 |
| 功能 | 快捷键 | 说明 |
|------|--------|------|
| 开始对比 | `Ctrl+Enter` | 将左右文本区的内容进行行级对比 |
| 交换左右 | `Ctrl+L` | 交换左右两侧文本 |
| 粘贴 | 点击按钮 | 从系统剪贴板粘贴到对应文本区 |
| 复制结果 | 点击按钮 | 将对比结果复制到剪贴板 |
| 保存报告 | 点击按钮 | 保存为 `export/yyyyMMdd/diff_paste_时间戳.txt` |
---
## 四、资源配置文件(`src/main/resources/`)
```
src/main/resources/
├── application.yml # Spring Boot 主配置文件
├── logback.xml # 日志框架配置
├── mybatis-generator.xml # MyBatis Generator 配置文件
├── mybatis-generator.properties # MyBatis Generator 数据库连接配置
├── config/ # 旧配置文件(已废弃,保留兼容)
└── templates/ # 数据文件模板(首次运行时复制到 user.dir)
├── project_paths.txt # 项目路径配置模板
└── damaged_repos.cache # 损坏仓库缓存模板
```
| 文件 | 说明 |
|------|------|
| `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/用户名/密码/驱动路径,以及生成的包路径 |
| `templates/` | 数据文件模板目录,首次运行时自动复制到 `user.dir` 同级目录 |
---
## 五、设计模式与架构特点
| 模式/特点 | 应用位置 | 说明 |
|-----------|---------|------|
| **插件架构** | `Plugin` + `PluginManager` + `PluginDescriptor` | 每个 biz 模块作为独立 Plugin,声明版本、描述,PluginManager 统一管理生命周期(load/enable/disable),可插拔扩展 |
| **策略模式** | `Plugin` 接口 + 各 biz 实现 | 各插件通过实现 Plugin 接口注册到 PluginManager,支持交互和命令行双模式 |
| **策略模式** | `GitCommandStrategy` + 各 Strategy 实现 | Git 命令执行策略,`GitStrategyFactory` 管理注册 |
| **工厂模式** | `PluginManager`、`GitStrategyFactory` | Spring 自动发现和注入 Bean |
| **命令模式** | `GitCommand` + `GitCommandController` | 封装 Git 命令的异步执行、中断、跳过 |
| **缓存模式** | `GitResultCache` | 缓存 Git 查询结果,减少重复命令执行 |
| **并发处理** | `GitCommandExecutor`、`ScannerService` | 线程池并发执行 Git 命令和多项目扫描 |
| **过滤器模式** | `MyBatisExportService` 内部类 | `SqlFilter` 接口实现表名/关键字/标签ID 过滤 |
| **模板回调** | `FileOperationHelper.scanFilesRecursively` | 使用 `SimpleFileVisitor` 实现文件遍历回调 |
| **分层架构** | `system/` vs `biz/` | system 定义平台契约与共享基础设施,biz 实现具体插件 |
| **内部隔离** | `biz/*/service/internal/` | 内部实现类用 `internal/` 隔离,不对外暴露 |
| **生命周期管理** | `Plugin.onLoad()` / `Plugin.onUnload()` | 插件加载/卸载回调,PluginContext 传递运行时上下文 |
---
## 六、依赖关系图
```
WorkUtilsApplication (入口)
├── 交互模式 → PluginManager.runMainMenu()
│ └── PluginManager.getEnabledPlugins()
│ ├── ScannerPlugin ────────────→ ScannerService
│ ├── MyBatisExportPlugin ──────→ MyBatisExportService
│ ├── MyBatisGeneratorPlugin ───→ MyBatisGeneratorService
│ ├── GitPlugin ────────────────→ GitService → GitStrategyFactory
│ └── DiffPlugin ───────────────→ (自含LCS算法,无外部依赖)
│
└── 命令行模式 → PluginManager.getPluginByCommand(command)
├── "scan" → ScannerPlugin.executeCommand(args)
├── "sql" → MyBatisExportPlugin.executeCommand(args)
├── "diff" → DiffPlugin.executeCommand(args)
└── "git" → GitPlugin.executeCommand(args)
(启动类不依赖任何具体业务 Service)
插件加载链路:
PluginManager.init()
├── 遍历 Spring 中所有 Plugin Bean
├── 依次调用 plugin.onLoad(PluginContext)
├── 按 ToolsConfig 过滤启用/禁用
└── 构建 pluginByIdMap / pluginByCommandMap / pluginStates
核心依赖链:
ScannerService → FileOperationHelper + OutputHelper
MyBatisExportService → FileOperationHelper + OutputHelper
GitService → FileOperationHelper + GitCommandExecutor
OutputHelper → FileOperationHelper + WorkUtilsProperties
FileOperationHelper → 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. **增加单元测试**,目前无测试代码
---
## 八、插件化架构设计
### 8.1 核心概念
```
┌──────────────────────────────────────────────────────┐
│ PluginManager │
│ ┌─────────────┐ ┌──────────────┐ ┌────────────┐ │
│ │ 生命周期管理 │ │ 注册与发现 │ │ 菜单/命令 │ │
│ │ load/unload │ │ id/command │ │ 分发 │ │
│ └─────────────┘ └──────────────┘ └────────────┘ │
│ │
│ pluginByIdMap pluginByCommandMap pluginStates │
└──────────────────────┬───────────────────────────────┘
│ onLoad(PluginContext)
┌──────────────┼──────────────┬──────────────┐
▼ ▼ ▼ ▼
ScannerPlugin MyBatisExport MyBatisGen GitPlugin DiffPlugin
[v1.0.0] [v1.0.0] [v1.0.0] [v1.0.0] [v1.0.0]
```
### 8.2 接口层次
```
Plugin (system/plugin/) ← 统一契约:getDescriptor/onLoad/onUnload/getMenuOptions/execute/...
↑
各 biz 模块 ← 具体实现:@Component + PluginDescriptor
```
### 8.3 插件描述符(PluginDescriptor)
每个插件通过静态 `PluginDescriptor` 声明自身元数据:
| 字段 | 说明 | 示例 |
|------|------|------|
| `id` | 全局唯一标识 | `"scan"`, `"mybatisexport"` |
| `name` | 菜单显示名称 | `"扫描功能"` |
| `version` | 语义化版本 | `"1.0.0"` |
| `description` | 功能简述 | `"关键词/Redis/Dubbo扫描工具"` |
| `dependencies` | 依赖的插件 ID(预留) | `[]` |
### 8.4 插件状态机
```
UNLOADED ──load──▶ LOADED ──enable──▶ ACTIVE ──disable──▶ DISABLED
▲ │ │ │
│ │ error │ error │
│ ▼ ▼ │
└──────────────── ERROR ◀──────────── ERROR ◀─────────────┘
unload ↻ UNLOADED
```
### 8.5 后续插件化方向
当前已完成插件化基础框架搭建,后续可进一步实现:
1. **SPI 自动发现** — 通过 `META-INF/services` 或 Spring Factories 自动发现外部 jar 中的 Plugin 实现
2. **独立打包** — 每个 biz 模块打成独立 jar,`PluginManager` 动态加载
3. **热加载** — 基于自定义 ClassLoader 实现插件的动态加载/卸载/更新
4. **依赖注入隔离** — 每个插件使用独立 Spring 子容器(`ApplicationContext`),避免 Bean 冲突
5. **插件市场** — 插件仓库 + 版本管理 + 远程下载
+166
View File
@@ -0,0 +1,166 @@
# 项目说明
## 项目概述
**项目名称**: workutils
**技术栈**: Spring Boot 3.2.3 + Java 21 + Maven
**项目类型**: Java工作工具集项目
**主要用途**: 金融科技(FinTech)系统的开发和维护工具集
## 主要功能模块
### 1. SQL代码分析工具
- MyBatis XML文件解析和SQL提取
- SQL语法检查和质量分析
- 数据库表引用扫描
- 支持跨项目批量扫描
- 问题SQL检测和报告生成
### 2. 代码扫描工具
- 关键字搜索和目录扫描
- Dubbo服务接口解析
- Redis键值对扫描
- 配置文件对比分析
- 项目依赖关系分析
### 3. 文件处理工具
- Markdown转Excel转换器
- CSV/Excel文件批量处理
- 文件批量操作和过滤
- 数据格式转换
### 4. Git操作工具
- 分支管理和对比
- 提交历史分析
- 版本控制自动化
- 代码差异检测
### 5. 配置管理工具
- Apollo配置对比
- 环境配置分析
- 数据库表清单管理
- 跨环境配置差异检查
## 核心功能说明
### MyBatis SQL分析模块
- 解析MyBatis XML映射文件
- 提取SQL语句并进行语法检查
- 识别潜在的性能问题
- 生成标准化的SQL报告
### Dubbo服务扫描
- 自动解析Dubbo注解和XML配置
- 提取服务提供者和消费者信息
- 生成服务接口清单
- 支持多项目并行扫描
### 关键字检索系统
- 支持全目录递归搜索
- 多种关键字匹配模式
- 生成详细的检索报告
- 支持正则表达式搜索
## 应用场景
主要用于**金融系统迁移、数据库重构、代码审查**等场景,包括:
- **系统架构升级**: 代码审计和依赖分析
- **数据库迁移**: SQL质量检查和优化
- **微服务架构**: 服务依赖关系梳理
- **生产环境**: 配置管理和对比分析
- **代码审查**: 自动化代码质量检查
## 技术特点
### 企业级特性
- 针对金融系统特点定制
- 支持大规模代码库扫描
- 高并发处理能力
- 企业级日志和错误处理
### 批量处理能力
- 支持多项目并行扫描
- 自动化的批量操作
- 性能优化的数据处理
### 标准化输出
- 生成标准格式的报告文件(CSV/Excel)
- 结构化的数据输出
- 易于集成到CI/CD流程
## 项目结构
```
workutils/
├── src/main/java/com/example/workutils/
│ ├── advanceinspect/ # 高级检查工具
│ ├── dubboscan/ # Dubbo扫描工具
│ ├── keywordscan/ # 关键字扫描工具
│ ├── model/ # 数据模型
│ ├── utils/ # 工具类
│ └── deprecated/ # 弃用代码
├── src/main/resources/
│ ├── config/ # 配置文件
│ ├── export/ # 输出文件目录
│ └── compare/ # 对比文件
└── pom.xml # Maven配置
```
## 依赖说明
项目使用的主要依赖包括:
- **Spring Boot**: 基础框架
- **MyBatis**: SQL解析
- **EasyExcel**: Excel文件处理
- **JGit**: Git操作
- **Dubbo**: 服务扫描
- **Apache Commons**: 工具库
## 使用方式
### 快速开始
```bash
# 编译项目
mvn clean compile
# 运行特定工具
java -cp target/classes com.example.workutils.advanceinspect.AllProjectSimpleXmlSQLExportorV5
```
### 配置说明
- 项目路径配置在 `src/main/resources/config/代码仓库项目路径.txt`
- 输出文件默认生成在 `src/main/resources/export/` 目录
- 支持自定义扫描规则和过滤器
## 输出文件格式
项目生成的标准输出格式包括:
- **CSV文件**: 适用于数据分析和导入
- **Excel文件**: 提供可视化报告
- **日志文件**: 详细的操作记录
## 注意事项
- 项目需要访问实际的代码仓库路径
- 部分功能需要配置相应的环境变量
- 建议在生产环境使用前进行充分测试
---
*这是一个高度专业化的内部工具集,主要服务于金融科技公司的开发和运维团队。*